Java同步集合与对象

use*_*811 2 java list synchronized

我想知道这些同步方式之间的区别是什么

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

synchronized (intList) {
    //Stuff
}
Run Code Online (Sandbox Code Playgroud)

并使用对象锁

Object objectLock = new Object();

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

synchronized (objectLock) {
    //Stuff
}
Run Code Online (Sandbox Code Playgroud)

use*_*ica 6

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

intList.add(3);
Run Code Online (Sandbox Code Playgroud)

另一个可以打电话

intList.clear();
Run Code Online (Sandbox Code Playgroud)

没有synchronized块,它将被正确同步.(不幸的是,当你需要为一组函数调用保持锁定时,这没有用;然后,你需要synchronized围绕这些调用阻塞.)另外,如果你需要传递列表,你可以使用

otherObject.doStuffWith(intList);
Run Code Online (Sandbox Code Playgroud)

return intList;
Run Code Online (Sandbox Code Playgroud)

代替

otherObject.doStuffWith(intList, objectLock);
Run Code Online (Sandbox Code Playgroud)

return ListAndLock(intList, objectLock);
Run Code Online (Sandbox Code Playgroud)