Tag: 同步

更好的解决方案而不是Java中的嵌套同步块?

我有一个Bank类,里面有Account列表。 银行有一个transfer()方法,用于将值从一个帐户转移到另一个帐户。 我们的想法是锁定转移中的from和to账户。 要解决这个问题,我有以下代码(请记住,这是一个非常简单的例子,因为它只是一个例子): public class Account { private int mBalance; public Account() { mBalance = 0; } public void withdraw(int value) { mBalance -= value; } public void deposit(int value) { mBalance += value; } } public class Bank { private List mAccounts; private int mSlots; public Bank(int slots) { mAccounts = new ArrayList(Collections.nCopies(slots, […]

我使用了同步列表,我仍然得到ConcurrentModificationException

我使用Vector而不是ArrayList在multithreading环境中使列表安全。 但是当我尝试在迭代它时向Vector添加项目时,我一直收到ConcurrentModificationException 。 为什么这样,我该如何预防呢?

调用者阻塞,直到getFoo()准备好了值?

我有一个Java Thread ,它暴露了其他线程想要访问的属性: class MyThread extends Thread { private Foo foo; … Foo getFoo() { return foo; } … public void run() { … foo = makeTheFoo(); … } } 问题是从运行到foo可用需要很短的时间。 调用者可以在此之前调用getFoo()并获取null 。 我宁愿他们只是阻塞,等待,并在初始化发生后获取值。 ( foo之后永远不会改变。)在它准备好之前它将是几毫秒,所以我对这种方法很满意。 现在,我可以通过wait()和notifyAll()实现这一点,并且有95%的可能性我会做得对。 但我想知道你们都会怎么做; 在java.util.concurrent有一个原语可以做到这一点,我错过了吗? 或者,你会如何构建它? 是的,让foo变得不稳定。 是的,在内部锁定Object上同步并将检查放入while循环,直到它不为null 。 我错过了什么吗?

你能安全地同步Java方法参数吗?

拿这个代码: public class MyClass { private final Object _lock = new Object(); private final MyMutableClass _mutableObject = new MyMutableClass() public void myMethod() { synchronized(_lock) { // we are synchronizing on instance variable _lock // do something with mutableVar //(ie call a “set” method on _mutableObject) } } } 现在,想象一下将myMethod()中的代码委托给传递锁的一些辅助类 public class HelperClass { public helperMethod(Object […]

在java中复制System.out和System.err之间的竞争

请考虑这个java代码: public class CMain { public static void main(String[] args){ for (int i = 0; i < 10; i++) { System.out.println("A"); System.err.println("B"); } } } 通过快速查看代码,我们中的一些人可能认为输出必须是As和Bs的印刷品。 不过不是! 它是10个字符和10个B字符的随机外观。 像这样的东西: 这是为什么? 什么是它的解决方案,以便As和Bs交替显示(ABABAB …)在我问这个问题之前,我检查了其他几个类似的问题以寻求解决方案,而不是为我的案例工作! 我在这里带了一些: 同步和System.out.println Java:同步标准输出和标准错误 Java:System.out.println和System.err.println乱序 PS。 我使用Eclipse作为我的IDE

从同步方法调用同步方法的同步成本是多少?

这之间的表现有什么不同吗? synchronized void x() { y(); } synchronized void y() { } 和这个 synchronized void x() { y(); } void y() { }

Java:线程在对象上等待时是否释放所有监视器?

在线程可以wait对象之前,它必须获取该对象上的监视器。 然后释放监视器,一旦唤醒,线程就会尝试重新获取它。 但是当线程调用wait时,线程保持的其他监视器会发生什么? 考虑这个例子: 对象a = // … 对象b = // … 同步(a)中 { 同步的(b)中 { b.wait(); //继续 } } 当线程调用b.wait() ,它会释放a和b上的锁,还是只释放b ?

正确使用同步单身?

因此,我正在考虑建立一个业余爱好项目,一种类似的东西,只是为了了解我的编程/设计。 它基本上是一个multithreading的Web蜘蛛,更新相同的数据结构对象 – > int。 因此,为此使用数据库绝对有点过分了,我唯一能想到的是用于包含我的数据结构的线程安全单例。 http://web.archive.org/web/20121106190537/http://www.ibm.com/developerworks/java/library/j-dcl/index.html 我应该考虑采用不同的方法吗?

为什么Java和C#会为每个对象添加内部锁?

使每个对象可锁定看起来像一个设计错误: 您为每个创建的对象添加了额外的成本,即使您实际上只在一小部分对象中使用它。 锁定用法变得隐含,具有lockMap.get(key).lock()比任意对象上的同步更具可读性,例如, synchronize (key) {…} 。 同步方法可能会导致用户使用synchronized方法锁定对象时出现细微错误 您可以确定在将对象传递给第3个parting API时,它的锁定未被使用。 例如 class Syncer { synchronized void foo(){} } … Syncer s = new Syncer(); synchronize(s) { … } // in another thread s.foo() // oops, waiting for previous section, deadlocks potential 更不用说每个对象的命名空间压缩(在C#中至少方法是静态的,在Java同步原语中必须使用await ,而不是在Object重载wait …) 但是我确信这个设计有一些原因。 内在锁的好处是什么?

Wait()/ notify()同步

我正在尝试检查java中wait / notify的工作原理。 码: public class Tester { public static void main(String[] args) { MyRunnable r = new MyRunnable(); Thread t = new Thread(r); t.start(); synchronized (t) { try { System.out.println(“wating for t to complete”); t.wait(); System.out.println(“wait over”); } catch (InterruptedException e) { e.printStackTrace(); } } } } class MyRunnable implements Runnable { public void […]