小编Sam*_*ire的帖子

是否可以在没有锁的情况下快速解决多线程银行帐户问题?

我正在尝试解决多线程银行帐户问题*,而不使用锁,而是使用多版本并发控制。它正在工作。只是有点慢。我怎样才能加快速度?

(*) 我有 5 个用户,每个用户从 200 开始 - 每个人随机提取 100 并将 100 存入另一个用户拥有的另一个银行账户。我预计到运行结束时银行余额总计为 1000。不应损失或创造任何金钱。这部分适用于我下面的实现。

import java.util.*;
import java.util.concurrent.*;
import java.util.function.Consumer;
import java.util.function.Function;

public class ConcurrentWithdrawer {

    private Map<String, Integer> database = new HashMap<>();
    private int transactionCount = 0;
    private final List<Transaction> transactions = Collections.synchronizedList(new ArrayList<>());

    public static void main(String[] args) {
        try {
            new ConcurrentWithdrawer().run();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static int getRandomNumberInRange(int min, int max) {

        if (min >= …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading completable-future

9
推荐指数
1
解决办法
341
查看次数

如何有效地搜索多个集合以查找集合的部分并集?

如果我有很多组字符串,并且每个字符串都有不同的项目,并且其中一些项目有重叠的项目。

我想搜索作为搜索集中所有项目的并集的集合。

我可以用哈希做些什么吗?

联盟是否找到了正确的算法?

这是我想要的布隆过滤器吗?

equals在下面的示例中,我可以首先依靠HashSet检查是否存在精确匹配。

我搜索每组并执行containsAll以查看它是否与搜索集并集。

举个例子,如果我用[“橙色”,“猕猴桃”,“苹果”]设置“水果”,用[“卷心菜”,“胡萝卜”,“西兰花”]设置“蔬菜”。我想要搜索 [“orange”、“kiwi”] 来匹配“fruits”

一定有比这更好的方法,但我不确定。

package main;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

public class SetKeyHash {

    public static void main(String args[]) {
        HashSet<String> vegetables = new HashSet<>();
        vegetables.add("tomato");
        vegetables.add("carrot");
        vegetables.add("broccoli");
        HashSet<String> fruit = new HashSet<>();
        fruit.add("apple");
        fruit.add("kiwi");
        fruit.add("orange");

        Map<HashSet<String>, String> map = new HashMap<>();
        map.put(vegetables, "vegetables");
        map.put(fruit, "fruit");

        HashSet<String> search = new HashSet<>();
        search.add("tomato");
        search.add("carrot");
        search.add("broccoli");
        System.out.println("Exact set search");
        System.out.println(map.get(search));
        System.out.println("Partial set search");
        HashSet<String> partialSearch = new HashSet<>();
        partialSearch.add("tomato");
        partialSearch.add("broccoli"); …
Run Code Online (Sandbox Code Playgroud)

java algorithm search set

5
推荐指数
1
解决办法
1070
查看次数

Java的对象模型在对象构造过程中如何保证线程安全?

我编写多线程软件,但我对 Java 有一些不明白的地方。

我的理解是Java对象共享内存地址空间。因此任意数量的线程都可以查看和访问任意数量的对象。

如果我在主线程中创建线程并将构造函数中的对象传递给每个线程,则 Java 解释器不会在线程之间进行编组。

Java 如何强制 Java 程序的内存模型是线程安全的并且不会看到部分对象构造?

换句话说,如果程序的构造函数正在运行,那么在创建对象时如何阻止内存模型无效?当然,我承认没有人可以引用正在构造的对象。但是Java的簿记必须将对象存储在内存中,并且需要是线程安全的。

java multithreading

1
推荐指数
1
解决办法
170
查看次数