В чем разница между 3 типами "синхронизированных" в Java? - PullRequest
0 голосов
/ 08 января 2019

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

Большое спасибо.

...