代码之家  ›  专栏  ›  技术社区  ›  Jin Kwon

一个锁对synchronized的作用相同吗?

  •  2
  • Jin Kwon  · 技术社区  · 8 年前

    假设我有一个线程安全的银行帐户类,如下所示

    class BankAccount {
    
        private long balance;
    
        public synchronized long getBalance() {
            return balance;
        }
    
        public synchronized void deposit(long amount) {
            balance += amount;
        }
    
        public synchronized void withdraw(long amount) {
            balance -= amount;
        }
    }
    

    使用锁有同样的效果吗?

    class BankAccount {
    
        private long balance;
    
        private final Lock lock = new ReentrantLock();
    
        public long getBalance() {
            try {
                lock.lock();
                return balance;
            } finally {
                lock.unlock();
            }
        }
    
        public void deposit(long amount) {
            try {
                lock.lock();
                balance += amount;
            } finally {
                lock.unlock();
            }
        }
    
        public void withdraw(long amount) {
            try {
                lock.lock();
                balance -= amount;
            } finally {
                lock.unlock();
            }
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   CHess    8 年前

    对。

    ReentrantLock:可重入互斥锁,其基本行为和语义与使用同步方法和语句访问的隐式监视锁相同,但具有扩展功能。

    From the official documentation for reentrant locks