Tag: 并发

Java中golang通道的等价物

我有一个要求,我需要从一组阻塞队列中读取。 阻塞队列由我正在使用的库创建。 我的代码必须从队列中读取。 我不想为每个阻塞队列创建一个读者线程。 相反,我想使用单个线程(或者可能最多使用2/3线程)轮询它们的数据可用性。 由于某些阻塞队列可能长时间没有数据,而其中一些阻塞队列可能会获得数据突发。 轮询具有较小超时的队列将起作用,但这根本不是有效的,因为它仍然需要在所有队列上保持循环,即使其中一些队列长时间没有数据。 基本上,我正在寻找阻塞队列的select / epoll(用于套接字)类型的机制。 任何线索都非常感谢。 尽管如此,在Go中这样做很容易。 下面的代码模拟了与channel和goroutines相同的内容: package main import “fmt” import “time” import “math/rand” func sendMessage(sc chan string) { var i int for { i = rand.Intn(10) for ; i >= 0 ; i– { sc = 0; i– { time.Sleep(20 * time.Millisecond) c <- rand.Intn(65534) } i […]

empty synchronized(this){}对线程之间的内存可见性有什么意义吗?

我在StackOverflow的评论中读到了这个: 但是如果你想要安全,你可以在@PostConstruct [方法]的末尾添加简单的synchronized(this){} [注意变量不易变化] 我认为只有在synchronized块中执行写入和读取或者至少读取是易失性时才强制执行before-before 。 引用的句子是否正确? 空的synchronized(this) {}块是否将当前方法中更改的所有变量刷新为“一般可见”内存? 请考虑一些场景 如果第二个线程永远不会锁定this怎么办? (假设第二个线程读入其他方法)。 请记住,问题是: 刷新对其他线程的更改 ,而不是给其他线程一种方式(同步)来轮询原始线程所做的更改 。 在Spring @PostConstruct上下文中,很可能在其他方法中没有同步 – 正如原始评论所说。 是仅在另一个线程的第二次和后续调用中强制执行的更改的内存可见性? (请记住,这个同步块是我们方法中的最后一次调用) – 这会将这种同步方式标记为非常糟糕的做法(第一次调用中的陈旧值)

并发访问静态方法

我有一个带有以下签名的静态方法: public static List processRequest(RequestObject req){ // process the request object and return the results. } 当同时对上述方法进行多次调用时会发生什么? 请求是同时处理还是一个接一个地处理?

这个基本的Java对象池有用吗?

以下基本对象池是否有效? 我有一个更复杂的基于相同的想法(即保持信号量和BlockingQueue)。 我的问题是 – 我需要Semaphore和BlockingQueue吗? 我是对的,我不需要做任何同步吗? import java.util.Collection; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Semaphore; public final class Pool { private final BlockingQueue objects; private final Semaphore permits; public Pool(Collection objects) { // we have as many permits as objects in our pool: this.permits = new Semaphore(objects.size()); this.objects = new ArrayBlockingQueue(objects.size(), false, objects); } public T […]

在Thread.join()之前调用Thread.interrupt()会导致join()立即抛出InterruptedException吗?

基本上,问题标题是什么。 Thread t = new Thread(someRunnable); t.start(); t.interrupt(); t.join(); //does an InterruptedException get thrown immediately here? 从我自己的测试来看,似乎,但只是想确定。 我猜测Thread.join()在执行“等待”例程之前检查线程的interrupted状态?

servlet中的threadlocal变量

threadlocals变量是否对拥有变量的servlet的所有请求都是全局的? 我在服务器上使用树脂。 谢谢awnser。 我想我可以让自己更清楚。 具体案例: 我要: 请求开始执行时初始化静态变量。 能够以线程安全的方式在从servlet调用的方法的进一步执行中查询变量的值,直到请求结束执行

在Brian Goetz的Java Concurrency In Practice中

Brian Goetz的Java Concurrency实践提供了一个用于并发使用的高效可伸缩缓存的示例。 这是该类的代码: public class Memoizer implements Computable { private final ConcurrentMap<A, Future> cache = new ConcurrentHashMap<A, Future>(); private final Computable c; public Memoizer(Computable c) { this.c = c; } public V compute(final A arg) throws InterruptedException { while (true) { Future f = cache.get(arg); if (f == null) { Callable eval = new […]

如何在ConcurrentHashMap线程安全的情况下更新BigDecimal

我正在制作一个应用程序,它需要一堆日记帐分录并计算总和。 当有多个线程调用addToSum()方法时,下面的方法是线程/并发安全。 我想确保每次通话都能正确更新总数。 如果不安全,请说明我必须做些什么来确保线程安全。 我需要synchronize get / put还是有更好的方法? private ConcurrentHashMap sumByAccount; public void addToSum(String account, BigDecimal amount){ BigDecimal newSum = sumByAccount.get(account).add(amount); sumByAccount.put(account, newSum); } 非常感谢! 更新: 谢谢大家的答案,我已经知道上面的代码不是线程安全的 。 感谢Vint建议将AtomicReference作为synchronize的替代方案。 我以前使用AtomicInteger来保存整数和,我想知道BigDecimal是否有类似的东西。 对两者的赞成和反对有明确的结论吗?

multithreading读取大量文件

我仍在围绕Java中的并发性工作。 我理解(如果您订阅了OO Java 5并发模型),您可以使用run()或call()方法(分别)实现Task或Callable ,并且您应该将尽可能多的实现方法并行化。可能。 但我仍然不理解Java中并发编程的固有内容: 如何为Task的run()方法分配适当数量的并发工作? 作为一个具体的例子,如果我有一个I / O绑定的readMobyDick()方法,它将Herman Melville的Moby Dick的全部内容从本地系统上的文件读入内存。 我只想说我希望这个readMobyDick()方法是并发的并由3个线程处理,其中: 线程#1将书籍的前1/3读入内存 线程#2将书籍的第二个1/3读入内存 线程#3将书的最后1/3读入内存 我是否需要将Moby Dick分成三个文件并将它们分别传递给自己的任务,或者我只是从实现的run()方法中调用readMobyDick()并且(不知何故) Executor知道如何打破其中的工作线程。 我是一个非常直观的学习者,因此非常感谢任何正确方法的代码示例! 谢谢!

JEE6 @ApplicationScoped bean和并发

我需要编写一个bean来充当访问它的次数的计数器。 我正在考虑将@ApplicationScoped bean与AtomicInteger一起使用 @ApplicationScoped class VisitsCounter { private AtomicInteger counter; @PostConstruct public void construct() { counter = new AtomicInteger(0); } public int visited() { return counter.incrementAndGet(); } } 我的问题是:在同时考虑多个请求时可以吗? 或者我需要使用@ConcurrencyManagement和@Lock注释吗? 我想Atomic*应该可以做到,但我不确定。 当我将线程安全集合作为字段时,同样适用吗? 比如说我有 @ApplicationScoped class ValuesHolder { private List values; @PostConstruct public void construct() { values = Collections.synchronizedList(new LinkedList()); } public void insert(String value) { […]