2

I'm wondering what the difference is between these ways of synchronization

List<Integer> intList = Collections.synchronizedList(new ArrayList<Integer>());

synchronized (intList) {
    //Stuff
}

and using an object lock

Object objectLock = new Object();

List<Integer> intList = new ArrayList<Integer>();

synchronized (objectLock) {
    //Stuff
}
4

2 回答 2

6

第一种方法确保各个方法调用是同步的,并且避免了需要管理单独的锁对象。一个线程可以调用

intList.add(3);

另一个可以打电话

intList.clear();

没有synchronized块,它会正确同步。(不幸的是,当您需要为一组函数调用持有锁时,这无济于事;然后,您需要synchronized围绕这些调用设置一个块。)此外,如果您需要传递列表,您可以使用

otherObject.doStuffWith(intList);

return intList;

代替

otherObject.doStuffWith(intList, objectLock);

return ListAndLock(intList, objectLock);
于 2013-08-20T00:32:18.080 回答
0

您显示的代码不一定是线程安全的!

一个摘录和另一个摘录之间的唯一区别是您用作同步监视器的对象。这种差异将决定哪个对象应该被其他需要访问您试图保护的可变数据的线程用于同步

很好的阅读:实践中的java并发

于 2013-08-20T00:38:33.960 回答