用Java代替“synchronized”关键字进行多线程处理

时间:2011-06-22 18:30:54

标签: 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 function
       check=true;
       notifyAll();
     } else {
       wait();
     }
  }
}

4 个答案:

答案 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