Java中的线程:如何锁定对象?

尼古·加慕林(Niko Gamulin):

以下函数在其自己的线程中执行:

private void doSendData()
{
    try {

           //writeToFile(); // just a temporary location of a call
           InetAddress serverAddr = InetAddress.getByName(serverAddress);
           serverAddr.wait(60000);
           //Log.d("TCP", "C: Connecting...");
           Socket socket = new Socket(serverAddr, portNumber);
           socket.setSoTimeout(3000);

               try {
                //Log.d("TCP", "C: Sending: '" + message + "'");
                PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
                String message = packData();
                out.println(message);
                Log.d("TCP", "C: Sent.");
                Log.d("TCP", "C: Done.");
                connectionAvailable = true;

             } catch(Exception e) {
                 Log.e("TCP", "S: Error", e);
                 connectionAvailable = false;

               } finally {
                  socket.close();
                  announceNetworkAvailability(connectionAvailable);
                }

         } catch (Exception e) {
              Log.e("TCP", "C: Error", e);
              announceNetworkAvailability(connectionAvailable);
         }
}

当执行到达该行时serverAddr.wait(60000),将引发异常:

java.lang.IllegalMonitorStateException: object not locked by thread before wait()

有谁知道如何锁定对象或函数以防止并发?我试图添加一个Lock对象:

private final Lock lock = new ReentrantLock();

和线

boolean locked = lock.tryLock();

在功能开始时,但是没有用。

尼尔·科菲(Neil Coffey):

为了在一个对象上调用wait(),您必须在该对象上持有同步锁(尽管该锁实际上是在线程等待时释放的):

synchronized (serverAddr) {
  serverAddr.wait();
}

我必须承认,在这种情况下为什么您要这样做让我感到困惑...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章