我正在尝试解决多线程银行帐户问题*,而不使用锁,而是使用多版本并发控制。它正在工作。只是有点慢。我怎样才能加快速度?
(*) 我有 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) 如果我有很多组字符串,并且每个字符串都有不同的项目,并且其中一些项目有重叠的项目。
我想搜索作为搜索集中所有项目的并集的集合。
我可以用哈希做些什么吗?
联盟是否找到了正确的算法?
这是我想要的布隆过滤器吗?
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 有一些不明白的地方。
我的理解是Java对象共享内存地址空间。因此任意数量的线程都可以查看和访问任意数量的对象。
如果我在主线程中创建线程并将构造函数中的对象传递给每个线程,则 Java 解释器不会在线程之间进行编组。
Java 如何强制 Java 程序的内存模型是线程安全的并且不会看到部分对象构造?
换句话说,如果程序的构造函数正在运行,那么在创建对象时如何阻止内存模型无效?当然,我承认没有人可以引用正在构造的对象。但是Java的簿记必须将对象存储在内存中,并且需要是线程安全的。