Я искал, что в классе есть 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) В чем основная разница между «синхронизированными» в качестве сигнатуры функции и «синхронизированными (этим)» для всего тела функции?
(2) В каком сценарии функциональный уровень «блокировка» лучше, чем функциональный уровень «синхронизирован (это)»?
Большое спасибо.