Java中3种类型的“同步”之间有什么区别?

时间:2019-01-08 06:24:40

标签: java function locking signature synchronize

我搜索了一个类内有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)”更好?

非常感谢。

0 个答案:

没有答案