Tag: 并发

如何在并发线程中操作`values()`和`put()`时避免使用HashMap“ConcurrentModificationException”?

码: 我有一个HashMap private Map map = new HashMap(); 一种方法是通过调用put(K,V)将KV对放入其中。 另一种方法想从其值中提取一组随机元素: int size = map.size(); // size > 0 V[] value_array = map.values().toArray(new V[size]); Random rand = new Random(); int start = rand.nextInt(size); int end = rand.nextInt(size); // return value_array[start .. end – 1] 这两个方法在两个不同的并发线程中调用。 错误: 我收到了一个ConcurrentModificationException错误: at java.util.HashMap$HashIterator.nextEntry(Unknown Source) at java.util.HashMap$ValueIterator.next(Unknown Source) at java.util.AbstractCollection.toArray(Unknown Source) […]

AtomicReference.compareAndSet()用于确定什么?

说你有以下课程 public class AccessStatistics { private final int noPages, noErrors; public AccessStatistics(int noPages, int noErrors) { this.noPages = noPages; this.noErrors = noErrors; } public int getNoPages() { return noPages; } public int getNoErrors() { return noErrors; } } 并执行以下代码 private AtomicReference stats = new AtomicReference(new AccessStatistics(0, 0)); public void incrementPageCount(boolean wasError) { AccessStatistics prev, newValue; […]

Java:除了它们所属的对象之外,同步方法是否锁定了什么?

现在,我不确定这是否是一个愚蠢的问题,如果是的话,请耐心等待。 对象上的锁是“递归的”,即如果两个对象在其字段中引用了第三个对象,并且一个线程正在其中一个上运行同步方法,那么任何其他线程是否可以访问第三个对象? // a and b are some objects that implement Runnable // they both reference the same third object a.ref = c; b.ref = c; // a is run in a thread and processes some data in a loop for a long time // the method the loop belongs to is declared synchronized threadA […]

安全出版没有发生 – 之前? 无论如何除了最后?

根据JCP(16.2.2。安全出版物): 这种情况发生之前 – 保证实际上是一种比安全出版物更强的可见性和排序承诺 。 当X安全地从A发布到B时,安全发布保证了X的状态的可见性,但不保证A可能触及的其他变量的状态。 但是如果A在队列中放置X,那么在B从该队列中取出X之前,不仅B在A离开它的状态下看到X(假设X后来没有被A或其他任何人修改过),但B看到A在切换之前所做的一切(再次,同样需要注意) 我想知道什么时候安全发布可以没有发生 – 也就是说没有使用volatile / atomics或同步(或通过使用任何内部列出的AQS之类的框架)? 一种情况是不可变对象中的最终字段,您可以将其发布为没有任何其他步骤。 还有其他案件吗? UPD:重新阅读3.5.3。 安全发布惯用语,另一种情况 – “从静态初始化程序初始化对象引用”。 现在看来这些都是选择。

什么是multithreading的最佳替代方案?

目前我们在应用程序(Java)中使用线程。 但是一次会创建大约1000个(或更多)线程。这个线程应该处理数据并将其存储在db中。 这会占用更多内存和I / O. 什么可能是最好的选择呢? 可扩展性,一致性和性能是主要要求。

使用锁保护非易失性字段的初始化?

出于教育目的,我正在编写一个简单版本的AtomicLong ,其内部变量由ReentrantReadWriteLock保护。 这是一个简化的例子: public class PlainSimpleAtomicLong { private long value; private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); public PlainSimpleAtomicLong(long initialValue) { this.value = initialValue; } public long get() { long result; rwLock.readLock().lock(); result = value; rwLock.readLock().unlock(); return result; } // incrementAndGet, decrementAndGet, etc. are guarded by rwLock.writeLock() } 我的问题 :由于“value”是非易失性的,其他线程是否可以通过PlainSimpleAtomicLong.get()观察到错误的初始值? 例如,线程T1创建L = new PlainSimpleAtomicLong(42)并与线程T2共享引用。 T2是否保证将L.get()视为42? […]

在ConcurrentLinkedQueue源代码中无法获取此条件

在ConcurrentLinkedQueue的源代码中,在offer方法中: public boolean offer(E e) { checkNotNull(e); final Node newNode = new Node(e); for (Node t = tail, p = t;;) { Node q = p.next; if (q == null) { // p is last node if (p.casNext(null, newNode)) { // Successful CAS is the linearization point // for e to become an element of […]

Thread.yield()之后线程的Thread.State是什么?

Thread.yield()之后线程的Thread.State是什么? 它是Thread.State.WAITING吗? 谢谢。

使用常规HashMap双重检查锁定

回到并发。 到目前为止,很明显,对于double checked locking ,变量需要声明为volatile 。 但是,如果使用双重检查锁定,如下所示。 class Test { private final Map map = new HashMap(); public B fetch(A key, Function loader) { B value = map.get(key); if (value == null) { synchronized (this) { value = map.get(key); if (value == null) { value = loader.apply(key); map.put(key, value); } } } return value; } […]

如何实现对Java中映射到内存的文件的并发读取?

我有许multithreading同时读取相同的文件(完全约100M),只有一个线程来更新文件。 我想将文件映射到内存中以减少文件I / O. 如何在Java中完成? 我基本上考虑了以下两种方法: 用字节数组来存储文件,每次创建ByteArrayInputStream以在multithreading读取时读取缓冲区。 使用NIO获取一个文件通道,同步通道以从MappedByteBuffer读取以进行multithreading读取。 我不确定这些方法是否有效。 如果有更好的解决方案,请帮助提供一些提示。