代码之家  ›  专栏  ›  技术社区  ›  Hind Forsum

java中三种类型的“同步”有什么区别?

  •  0
  • Hind Forsum  · 技术社区  · 6 年前

    我在一个类中搜索了三种类型的同步函数调用,我在下面列出了它们。

    只是好奇一下,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) 在什么情况下,功能级“锁定”比功能级“同步(此)”好?

    谢谢。

    0 回复  |  直到 6 年前