我在一个类中搜索了三种类型的同步函数调用,我在下面列出了它们。
只是好奇一下,SyncCollection1、SyncCollection2、SyncCollection3之间的核心区别是什么,它们中的任何一个都有潜在的问题吗?
class SyncCollection1 { // using synchronized in function signature
List<Integer> list = new ArrayList();
public synchronized void add(int o) {
list.add(o);
}
public synchronized void remove(int o) {
list.remove(o);
}
}
class SyncCollection2 { // using synchronized(this) inside function
List<Integer> list = new ArrayList();
public void add(int o) {
synchronized (this) {
list.add(o);
}
}
public void remove(int o) {
synchronized (this) {
list.remove(o);
}
}
}
class SyncCollection3 { // using ReentrantLock lock()/unlock()
List<Integer> list = new ArrayList();
Lock reentrantLock = new ReentrantLock();
public void add(int o) {
reentrantLock.lock();
list.add(o);
reentrantLock.unlock();
}
public void remove(int o) {
reentrantLock.lock();
list.remove(o);
reentrantLock.unlock();
}
}
(1) 将“synchronized”作为函数签名和将“synchronized(this)”作为整个函数体之间的核心区别是什么?
(2) 在什么情况下,功能级“锁定”比功能级“同步(此)”好?
谢谢。