本地变量访问 - 同步

时间:2012-05-18 10:40:09

标签: java synchronization

在我的程序中,我有以下模板的功能:

public MyObject myMethod() {

   final MyObject[] myObject = new MyObject[]{null};
   MyListener myListener= new MyListener() {
      public void messageReceived(MyObject newData) {
         // Thread #1
         myObject[0] = newData;
      }
   }

   ...

   // Thread #2
   while (myObject[0] == null) ;
   return myObject[0];
}

不幸的是,Java 64位中的同步原因存在问题线程#2没有看到线程#1做出任何更改,而while循环永远不会结束。我应该如何同步这些线程?

谢谢!

3 个答案:

答案 0 :(得分:1)

你正在做一个忙碌的循环。这几乎不是一个好主意。改为使用阻塞数据结构,如BlockingQueue。收到消息后,将其放入队列中。并让你的接收器从队列中获取消息。当队列中没有消息时,接收器将被阻塞。

答案 1 :(得分:1)

尝试使用java.util.concurrent.ArrayBlockingQueue而不是Array ...然后你不必使用synchronized关键字。它的线程安全。

答案 2 :(得分:1)

您可以在两个线程中对Synchronized对象使用myObject块(因为它永远不为空)。

synchronized(myObject) {
    ...do stuff ...
}

建议:使用wait-notify机制,而不是使用while循环。