Tag: 同步

Java ArrayList / String / atomic变量读取线程是否安全?

我一直在考虑阅读和阅读,但可以找到绝对权威的答案。 我有几个深层数据结构,由包含ArrayLists,Strings和原始值的对象组成。 我可以保证这些结构中的数据不会改变(没有线程会对列表进行结构更改,更改引用,更改基元)。 我想知道在这些结构中读取数据是否是线程安全的; 即从对象递归读取变量是否安全,迭代ArrayLists等以从多个线程中的结构中提取信息而不同步?

Java:引用同步对象需要volatile / final吗?

这似乎是一个非常基本的问题,但我找不到明确的确认。 假设我有一个正确同步的类: public class SyncClass { private int field; public synchronized void doSomething() { field = field * 2; } public synchronized void doSomethingElse() { field = field * 3; } } 如果我需要引用该类的实例,在线程之间共享, 我仍然需要声明该实例是volatile还是final ,我是对的吗? 如: public class MainClass { // previously OuterClass public static void main(String [ ] args) { final SyncClass mySharedObject = […]

单线程应用程序中的同步方法是否更慢?

在过去的几分钟里,我一直在为自己辩论,而且我看到了是和否的原因。 这源于查看Java HashMap与Hashtable的答案,并看到有几个人说Hashtable实际上更慢。 在我看来,如果在单个线程中运行,同步方法应该与其非同步方法完全没有区别,因为同步操作不应该阻塞任何内容。 也就是说,我认为编译器会以不同的方式处理这两种情况,这就是人们说同步速度较慢的原因。 并不是说它无论如何都是决定性的,但我对HashMap和Hashtable进行了一些简单的测试,并且看到了速度上的差别。

变量的同步和本地副本

我正在查看一些具有以下习语的遗留代码: Map myMap = someGlobalInstance.getMap(); synchronized (myMap) { item = myMap.get(myKey); } 我从Intelli-J的代码检查得到的警告是: Synchronization on local variable ‘myMap’ 这是适当的同步吗?为什么? Map myMap = someGlobalInstance.getMap(); synchronized (someGlobalInstance.getMap()) { item = myMap.get(myKey); }

C#强制执行语句的顺序

我的问题是关于C#中执行保证的顺序(通常可能是.Net)。 我给出了一些我知道要比较的Java示例。 对于Java(来自“Java Concurrency in Practice”) 无法保证一个线程中的操作将按程序给出的顺序执行,只要在该线程内无法检测到重新排序 – 即使重新排序对其他线程是明显的。 所以代码 y = 10; x = 5; a = b + 10; 可能实际上指定a = b + 10在指定y = 10之前 在Java中(来自同一本书) 当线程A启动由同一个锁保护的同步块时,线程A在同步块之前或之前执行的所有内容都对线程B可见。 所以在Java中 y = 10; synchronized(lockObject) { x = 5; } a = b + 10; 保证y = 10和x = 5都在a = b + 10之前运行(我不知道y = […]

我应该同步监听器通知吗?

我总是非常犹豫要把我的锁公开,让它们公开。 我总是试图将锁限制在我的实现中。 我相信,不这样做是一个僵局的秘诀。 我有以下课程: class SomeClass { protected ArrayList mListeners = new ArrayList(); protected void addListener(Listener listener) { synchronized (mListeners) { mListeners.add(listener); } } protected void removeListener(Listener listener) { synchronized (mListeners) { mListeners.remove(listener); } } … } 当SomeClass想要通知他的听众时,你会这样做: synchronized (mListeners) { for (Listener l : mListeners) { l.event(); } } 要么 Listener[] listeners = null; […]

Java:同步实用程序

我问这纯粹是为了确定在问题中实施课程的有价值的… 您是否知道Java实用程序类采用未同步的实例,使用reflection来调查该实例,并在同步调用中返回“包装”的输入实例? (即:为任何实例创建同步委托类的工厂)

Thread.sleep()在java中同步

当调用Thread.sleep(10000)时,当前Thread将进入hibernate状态。 如果在同步方法中调用Thread.sleep(10000)是否其他线程可以在该时间段内执行?

是否可以修改非易失性变量,以便另一个线程能够“看到”更新?

我有一个Thread-X,它每秒读取一个非易失性变量,没有任何同步手段。 现在我想知道是否有某种方法可以修改Thread-Y上的非易失性变量,以便Thread-Y的写入(最终)在Thread-X上可见? public class Test { private static boolean double = 1; // this variable is // strictly not volatile public static void main(String args[]) { new java.lang.Thread(new java.lang.Runnable() { @Override public void run() { while (true) { System.out.println(variable); try { java.lang.Thread.currentThread().sleep(1000); } catch (java.lang.InterruptedException e) { } } } }).start(); // line 17 new […]

如何分配给局部变量在这里有帮助?

我正在阅读Effective Java双重检查锁定。 代码执行以下操作: private volatile FieldType field; FieldType getField() { FieldType result = field; if (result == null) { // First check (no locking) synchronized(this) { result = field; if (result == null) // Second check (with locking) field = result = computeFieldValue(); } } return result; } 它表示使用result似乎不需要,但实际上确保该field仅在已经初始化的常见情况下只读取一次。 但我不明白这一点。 直接做if(field == null)有什么区别? 我不明白为什么if (result […]