Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.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_Multithreading - Fatal编程技术网

取代;同步的;Java中用于多线程的关键字

取代;同步的;Java中用于多线程的关键字,java,multithreading,Java,Multithreading,能否检查此代码是否为线程安全/替换同步功能?比如限制对多个线程的访问 class CheckSynch{ public static booloean check=true; public static void func() // I am trying to write alternative code for synchronized function { if(check) { check=false; //body of funct

能否检查此代码是否为线程安全/替换同步功能?比如限制对多个线程的访问

class CheckSynch{

  public static booloean check=true;

  public static void func() // I am trying to write alternative code for synchronized function
  {
     if(check) {
       check=false;
       //body of function
       check=true;
       notifyAll();
     } else {
       wait();
     }
  }
}

任何不使用正确同步的东西都注定会中断。如果您有两个硬件线程,它们将同时运行,因此在检查和修改
check
之间的时间内,可能会出现另一个线程并对其进行更改


我不知道你为什么要避开已同步的,但不管你试图对未同步的函数做什么,它都不会起作用,最终会很难重现bug。

不,等等()需要在同步块中。

在静态方法中总是建议避免
同步的


我同意EboMike的观点,不过如果您希望基于读/写标准阻止线程。。您可以始终使用

编写自己的锁定/同步是一个非常高级的主题,编写编译的代码不是一个高级主题。你必须问问自己这是否真的是个好主意

你可以这样写

final Lock lock = new ReentrantLock();

public static void func() {
    lock.lock();
    try {
       //body of function
    } finally {
       lock.unlock();
    }
}
但是,您还没有说明为什么要编写自己的同步。我认为这是因为你不想等待1-2微秒来获得锁

您可以改为使用忙循环

final AtomicBoolean lock = new AtomicBoolean();

public static void func() {
    // wait for the lock to be false and set it to true.
    while(lock.getAndSet(true)); 
    try {
        // body of function
    } finally {
        lock.set(false);
    }
}

相信我,您不需要编写synchronized关键字的替代项。有些人比你聪明得多,他们已经设计好了,无意冒犯。这些代码甚至不会运行,更不用说线程安全了。wait/notify必须位于同步块内,否则您就没有什么可等待或通知的。也许值得解释为什么建议“在静态方法中避免同步块”。@Peter Lawrey,我相信您的意思是
compareAndSet(false,true)
而不是
getAndSet(true)
+1作为一个好的选择。您也可以执行
比较数据集
,但是
布尔值
只有两个可能的值。我会用你觉得更清楚的任何东西。@Peter,我正试图说服自己getAndSet会像最初发布的那样工作。如果该值为
false
,则表示锁是自由的。因此,
while(lock.getAndSet(true))
在第一次执行时总是会失败。但是,这就像打开了防洪门。第二次通过它工作,其他线程的每一次尝试也是如此,直到有人退出。我想如果值被反转,它会工作……第一个线程看到它是
false
,将它设置为
true
,并中断循环。每隔一个线程都会看到
true
,并且会继续这样做,直到一个线程将其设置为
false
。我已经习惯于看到相同的模式。。。获取值,对其进行操作,尝试CAS。。。重复,直到成功。