您可以检查此代码是否是线程安全/替换同步的功能?比如限制对多个线程的访问?
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();
}
}
}
答案 0 :(得分:7)
任何不使用正确同步的东西都必然会破坏。如果你有两个硬件线程,它们将同时运行,所以在检查和修改check
之间的时间内,可能会出现另一个线程并对其进行更改。
我不知道你为什么试图回避synchronized
,但无论你试图用非同步函数做什么,它都行不通,最终会破坏非常难以重现的错误
答案 1 :(得分:5)
编写自己的Locking / sychronizaton是一个非常高级的主题,编写编译的代码不是一个高级主题。你必须问自己这是不是一个好主意。
您可以编写类似
的内容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);
}
}
答案 2 :(得分:2)
不,wait()需要处于同步块中。
答案 3 :(得分:0)
始终建议避免使用静态方法中的synchronized
块。
我同意EboMike,虽然如果您希望根据读/写条件阻止线程..您可以随时使用ReentrantReadWriteLock