我搜索了一个类内有3种类型的同步函数调用,在下面列出了它们。
好奇的是,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)在整个函数体中将“已同步”作为函数签名和“已同步(this)”之间的核心区别是什么?
(2)在什么情况下,功能级别“锁定”比功能级别“同步(this)”更好?
非常感谢。