Java 当我们有更简单的方法时,为什么要使用同步关键字

Java 当我们有更简单的方法时,为什么要使用同步关键字,java,Java,使用一个变量,我们可以确保在任何时候只有一个方法执行在进行中,请参阅下面建议的代码。我想知道为什么我们要用synchronized呢 public class Test { private static boolean lock = false; public void testMethod() { if(lock){ System.out.println("Method run is in progress"); return; } l

使用一个变量,我们可以确保在任何时候只有一个方法执行在进行中,请参阅下面建议的代码。我想知道为什么我们要用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;
}
} 
不是那么简单

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

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

它并不是那么简单

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


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

同步的
提供了“锁”没有提供的东西

  • 同步是可重入的,持有锁的线程可以重新进入关键部分
  • Synchronized为互斥体和部分中的数据提供了新的可见性,您将无法在多线程环境中获得
    lock
    的实际值
    比赛条件
    记忆障碍

    进行一些研究
    同步
    提供了你的“锁”没有的东西

  • 同步是可重入的,持有锁的线程可以重新进入关键部分
  • Synchronized为互斥体和部分中的数据提供了新的可见性,您将无法在多线程环境中获得
    lock
    的实际值
    对比赛条件和记忆障碍做些研究不,你不能。。。进入的两个线程都将遇到
    lock==false
    并继续它们的方式。在您的示例中,如果方法被锁定,则不会执行其主体。然而,同步使线程等待,然后继续执行。谢谢@wero这似乎是一个很好的理由,请不要使用否决票来反映您对问题的明显性质的失望。我觉得这个问题很好。伙计们,请记住基本问题不是必要的坏问题不,你们不能。。。进入的两个线程都将遇到
    lock==false
    并继续它们的方式。在您的示例中,如果方法被锁定,则不会执行其主体。然而,同步使线程等待,然后继续执行。谢谢@wero这似乎是一个很好的理由,请不要使用否决票来反映您对问题的明显性质的失望。我觉得这个问题很恰当。伙计们,请记住,基本问题并不是一个坏问题