此">答案提供了对IntStream进行分区的实现:
IntStream intStream = IntStream.iterate(0, i -> i + 1).limit(1000000);
Predicate<Integer> p = x -> r.nextBoolean();
Map<Boolean, List<Integer>> groups = intStream.collect(() -> {
Map<Boolean, List<Integer>> map = new HashMap<>();
map.put(false, new ArrayList<>());
map.put(true, new ArrayList<>());
return map;
}, (map, x) -> {
boolean partition = p.test(x);
List<Integer> list = map.get(partition);
list.add(x);
}, (map1, map2) -> {
map1.get(false).addAll(map2.get(false));
map1.get(true).addAll(map2.get(true));
});
System.out.println(groups.get(false).size());
System.out.println(groups.get(true).size());
但是它的编辑提到这个实现不是线程安全的。然而,据我所知,收集器创建了一个单独的HashMap
顺便说一句:答案提供了一个更优雅的解决方案(
Stream)
PS:我想把这个问题作为评论添加到原始帖子中,但我甚至没有声誉来添加评论…:|
嗯,Random
是线程安全的,但是不应该以这种方式使用,因为它在争用下的性能很差,但是ArrayList
不是线程安全的。使用并行流,您将调用list。从多个线程添加(x)
。
根据神谕文献
与减少(int, IntBinaryoperator)一样,收集操作可以并行化,而无需额外的同步。
https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html#collect-爪哇。util。作用供应商java。util。作用ObjIntConsumer java。util。作用双消费者-
看来你的直觉是对的,这是线程安全的。
问题内容: 我在这里谈论基本用法: 谷歌搜索以上问题,说是,但不是 -接受的答案是,是,但后续行动是否;Spring.io表示是和否,并且似乎是Java EE专家的Adam Bien给出了不合格的yes。 我对一个简单的调度bean的经验表明答案是否定的: 抽象界面: 开始于: 如果我打印出,即使我在两次调用之间仍在同一线程上,也会得到: 严重:java.lang.IllegalStateExce
我读过很多关于Servlet和threadsafe的文章--我知道,“Servlet容器只加载和实例化每个Servlet一次……”。但是,如果我创建抽象类extends Servlet,它有一个用参数处理的方法,那么在后代中使用这个threadsafe吗?
在我的应用程序中,我使用多个线程来处理客户端连接。 我在调试时发现了一个非常奇怪的行为——我有一个SelectionKey,通过调用(使用调试器)它的interestTops()方法,返回值是1(READ),但当我将数据发送到与该键对应的套接字时,选择器不会被唤醒。。 如果使用调试器,我将特定选择键更改为1(即使是1),选择器会突然对该更改做出反应。 在给定的时间内,我只有一个线程处理一个连接,但
我们都知道查询不应该在UI线程上执行,但是,令人惊讶的是,我在官方文档中找不到有关类的线程安全性的信息。 我知道如何编写线程安全的,并且我知道默认情况下是线程安全的(它实现了内部锁定机制)。 但是,从多个线程使用的单个实例安全吗(例如,在同一对象上并行调用或?
问题内容: 我注意到,如果我尝试在循环内使用goroutines将其追加到切片,那么在某些情况下我会丢失/空白数据: 有时,当我从中打印all 时,某些元素是空字符串(),而在另一些情况下,in中则不存在某些元素。 我的代码是否存在数据争用,是否意味着对于多个goroutine并发使用来说不是线程安全的? 问题答案: 在Go中,没有值可以安全地进行并行读/写操作,切片(切片头)也不例外。 是的,您
问题内容: https://github.com/xetorthio/jedis/wiki/入门 在多线程环境中使用Jedis 您不应该使用来自不同线程的相同实例,因为您会遇到奇怪的错误。有时创建大量的Jedis实例还不够好,因为这意味着大量的套接字和连接,这也会导致奇怪的错误。 单个Jedis实例不是线程安全的 !为避免这些问题,应使用JedisPool,它是网络连接的线程安全池。给定完成后将J