取代;同步的;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。。。重复,直到成功。