我想知道这些同步方式之间有什么区别
List<Integer> intList = Collections.synchronizedList(new ArrayList<Integer>());
synchronized (intList) {
//Stuff
}
并使用对象锁
Object objectLock = new Object();
List<Integer> intList = new ArrayList<Integer>();
synchronized (objectLock) {
//Stuff
}
答案 0 :(得分:6)
第一种方法确保单个方法调用是同步的,并且它避免了需要管理单独的锁对象。一个线程可以调用
intList.add(3);
另一个可以打电话
intList.clear();
没有synchronized
块,它将被正确同步。 (不幸的是,当你需要为一组函数调用保持锁定时,这没有用;然后,你需要围绕这些调用synchronized
阻止。)另外,如果你需要传递列表,你可以使用
otherObject.doStuffWith(intList);
和
return intList;
而不是
otherObject.doStuffWith(intList, objectLock);
和
return ListAndLock(intList, objectLock);
答案 1 :(得分:0)
您展示的代码不一定是线程安全的!!
一个摘录与另一个摘录之间的唯一区别是您用作同步监视器的对象。这种差异将决定哪个对象应该用于需要访问您尝试保护的可变数据的其他线程的同步