锁和同步方法之间的区别

时间:2015-05-13 20:34:30

标签: java methods concurrency synchronized locks

我理解同步允许隐式锁定,但这些结果不会产生相同的结果吗?

以下两段代码之间有什么区别?为什么程序员会选择使用每个?

代码块#1

class PiggyBank {    
    private int balance = 0; 
    public int getBalance() {
        return balance; 
    }
    public synchronized void deposit(int amount) { 
        int newBalance = balance + amount;
        try {
            Thread.sleep(1);
        } catch (InterruptedException ie) {
            System.out.println("IE: " + ie.getMessage());
        }
        balance = newBalance;
    }
}

代码块<2

class PiggyBank {
    private int balance = 0;
    private Lock lock = new ReentrantLock(); 

    public int getBalance() {
        return balance; 
    }
    public void deposit(int amount) { 
        lock.lock();
        try {
            int newBalance = balance + amount; 
            Thread.sleep(1);
            balance = newBalance;
        } catch (InterruptedException ie) { System.out.println("IE: " + ie.getMessage());
        } finally { 
            lock.unlock();
        } 
    }
}

1 个答案:

答案 0 :(得分:3)

您提供的两个示例都将用于相同的目的,它们在线程安全方面是相同的(我也会挥发您的余额)。 ReentrantLock更加“非结构化”,这意味着您可以在一个方法中锁定一个关键部分并在另一个方法中解锁它;由于它在块上的结构,因此无法使用synchronized执行某些操作。

还有一个性能问题,您希望在同步时使用ReentrantLock,但只有在涉及多个线程时才会出现这种情况。