为什么在我们有一个更简单的方法时使用synchronized关键字

时间:2015-12-29 13:12:43

标签: java

使用变量我们可以确保任何时候只有一个方法正在执行,请参阅下面的建议代码。我想知道为什么我们使用synchronized呢?

public class Test {
private static boolean lock = false;

public void testMethod() {
    if(lock){
        System.out.println("Method run is in progress");
        return;
    }
    lock=true;
    try{
        System.out.println("Doing some stuffs here");
    }
    catch(Exception e){

    }
    finally{
       lock=false;
    }
    return;
}
} 

2 个答案:

答案 0 :(得分:2)

这不是那么简单。

您的方案的一个简单反例:如果两个线程同时遇到您的函数testMethod,则两者都可以将lock视为false

同样适用于finally块中的代码。

答案 1 :(得分:1)

synchronized提供的关键词#{}}锁定"没有按'吨

  1. 同步为reentrant,持有锁的线程可以重新进入关键部分。
  2. Synchronized为互斥锁和该部分中的数据提供了新的可见性,您将无法在多线程环境中获得lock的实际值。
  3. race-conditionsmemory-barriers

    进行一些研究