Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 锁和同步方法之间的区别_Java_Methods_Concurrency_Synchronized_Locks - Fatal编程技术网

Java 锁和同步方法之间的区别

Java 锁和同步方法之间的区别,java,methods,concurrency,synchronized,locks,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

我知道同步允许隐式锁,但这些锁不会产生相同的结果吗

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

代码块#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;
    }
}
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();
        } 
    }
}
代码块#2

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;
    }
}
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();
        } 
    }
}

您提供的两个示例都有相同的用途,并且它们在线程安全方面是相同的(我也希望您保持平衡)。ReentrantLock更“非结构化”,这意味着您可以在一个方法中锁定关键部分,并在另一个方法中解锁它;无法使用synchronized执行某些操作,因为它是块上的结构


还有一个性能问题,您希望在同步上使用ReentrantLock,但只有在涉及多个线程时才是这样

是的,这些看起来相当。在这种情况下,大多数程序员会选择选项1,但在需要更多控制的更复杂的上下文中,您可能需要锁。两者都很容易出错,因为对
余额的读取应该是不稳定的或处于锁下。
synchronized
版本会泄漏锁,这是一个糟糕的做法。