Tag: 同步

为什么我需要同步Collections.synchronizedList返回的列表

我发现这是在dos.oracle.com public static List synchronizedList(列表列表) 返回由指定列表支持的同步(线程安全)列表。 为了保证串行访问,必须通过返回的列表完成对后备列表的所有访问。 当迭代它时,用户必须手动同步返回的列表: List list = Collections.synchronizedList(new ArrayList()); … synchronized(list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); } 我的问题是:如果Collections.synchronizedList();我为什么必须同步列表来迭代它Collections.synchronizedList(); 应该返回一个已经同步的列表? 我只是在两个线程中访问列表:一个线程只添加,另一个线程获取和删除。 您建议在此方案中使用哪些其他类? 谢谢阅读。

在我的例子中,Synchronized和Lock有什么区别?

我写了一个简单的代码来使用Lock和synchronized来模拟并发。 源代码如下: Task类包含一个名为doSomething()的方法来打印线程名称并执行已用时间。 import java.util.Calendar; public class Task { public void doSomething() { try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } StringBuilder sb = new StringBuilder(); //Thread Name sb.append(“Thread Name: “).append(Thread.currentThread().getName()); //Timestamp for the executing sb.append(“, elaspsed time: “).append(Calendar.getInstance().get(13)).append(” s “); System.out.println(sb.toString()); } } TaskWithLock类 import java.util.concurrent.locks.Lock; import […]

挥发性背驮式。 这对于visiblity来说足够了吗?

这是关于挥发性的背驮式。 目的:我希望达到轻量级vars visibilty。 a_b_c的一致性并不重要。 我有一堆vars,我不想让它们都变得不稳定。 这段代码是否安全? class A { public int a, b, c; volatile int sync; public void setup() { a = 2; b = 3; c = 4; } public void sync() { sync++; } } final static A aaa = new A(); Thread0: aaa.setup(); end Thread1: for(;;) {aaa.sync(); logic with aaa.a, aaa.b, […]

在使用迭代器时解释集合的同步?

我知道像Hashtable这样的集合是同步的,但是有人可以向我解释它是如何工作的,以及在什么时候访问仅限于并​​发调用? 例如,假设我使用了一些像这样的迭代器: Hashtable map = new Hashtable(); void dosomething1(){ for (Iterator<Map.Entry> i = map.entrySet().iterator(); i.hasNext();){ // do something } } void dosomething2(){ for (Iterator<Map.Entry> i = map.entrySet().iterator(); i.hasNext();){ // do something // and remove it i.remove(); } } void putsomething(int a, int b){ map.put(a,b); } void removesomething(int a){ map.remove(a); } var clear(){ map = new […]

字段读取和volatile的同步之间的区别

在一篇包含一些并发技巧的文章中 ,一个示例针对以下几行进行了优化: double getBalance() { Account acct = verify(name, password); synchronized(acct) { return acct.balance; } } 如果我理解正确,同步的关键是确保此线程读取的acct.balance的值是最新的,并且对acct.balance中对象的字段的任何挂起写入也写入主存储器。 这个例子让我想一想:将acct.balance(即类Account的字段余额)声明为volatile是不是更有效率? 它应该更有效,除了你对acct.balance访问的所有synchronize ,并不会锁定整个acct对象。 我错过了什么吗?

为什么用Java检查双重检查锁定?

据说,除了long或double字段外,字段赋值总是primefaces的。 但是,当我读到为什么双重检查锁定被破坏的解释时,它说问题在于赋值操作: // Broken multithreaded version // “Double-Checked Locking” idiom class Foo { private Helper helper = null; public Helper getHelper() { if (helper == null) { synchronized(this) { if (helper == null) { helper = new Helper(); } } } return helper; } // other functions and members… } 线程A注意到该值未初始化,因此它获得锁定并开始初始化该值。 由于某些编程语言的语义,允许编译器生成的代码在A完成初始化之前更新共享变量以指向部分构造的对象。 线程B注意到共享变量已初始化(或显示),并返回其值。 因为线程B认为该值已经初始化,所以它不会获得锁定。 如果B在B看到A完成的所有初始化之前使用该对象(因为A尚未完成初始化或者因为对象中的某些初始化值尚未渗透到内存B使用(缓存一致性)) […]

同步和静态同步有什么区别?

对于有100个并发用户登录的旅行预订网络应用程序,是否应通过“同步”或“静态同步”方法实现机票预订并生成“电子机票号码”?

在多个不同线程之间共享变量

我想在多个线程之间共享一个变量,如下所示: boolean flag = true; T1 main = new T1(); T2 help = new T2(); main.start(); help.start(); 我想在main和help线程之间共享flag ,这些是我创建的两个不同的Java类。 有办法做到这一点吗? 谢谢!

为什么wait / notify / notifyAll方法在java中不同步?

在Java中,每当我们需要调用wait / notify / notifyAll时,我们需要访问对象监视器(通过synchronized方法或通过synchronized块)。 所以我的问题是为什么java没有去同步等待/通知方法去除从同步块或方法调用这些方法的限制。 如果它们被声明为synchronized,它将自动获取监视器访问权限。

关于Java同步的问题

Java文档说“同一个对象上的两个同步方法的调用不可能交错”。 我需要知道的是,synchronized是否还会阻止同一类的两个不同实例中的同步方法进行交错。 例如,类Worker具有名为process()的方法。 我们有几个Worker在自己的线程中运行的实例。 我们希望防止同时运行process()方法的多个实例。 会同步吗? 谢谢。