当前位置: 首页 > 面试题库 >

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

朱季
2023-03-14
问题内容

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

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();

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


问题答案:

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

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

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



 类似资料:
  • 问题内容: 我有一个Web应用程序,并且正在使用Oracle数据库,并且有一种基本上像这样的方法: 现在没有任何类型的同步,因此n个线程当然可以自由地访问此方法,当2个线程都进入此方法都进行检查并且当然还没有任何东西时,就会出现问题,然后它们都可以提交事务并创建一个重复的对象。 我不想在数据库中使用唯一的密钥标识符来解决此问题,因为我认为我不应该抓住它。 我也不能在提交之前进行检查,因为不仅要进行

  • 我正在修改一个Java服务器软件。整个应用程序是单线程的。我的一个更改需要很多时间,所以我决定异步执行,以避免冻结主线程。 问题是:这种锁在Java中的最佳实现是什么?例如,我是否应该使用亲自完成。 编辑:看看我当前实现的答案。

  • 我的问题是。。。为什么选择completionLock。run方法中的lock()未锁定资源。当我在系统中运行程序时。出来println(Thread.currentThread())。getName()) 我得到以下输出:Thread-1 Thread-0 Thread-0 Thread-1 NoLock ATM:130 Locked ATM:160应该是:160程序终止。 还有什么是等到完成才

  • Java多线程中“私有最终对象”锁定有什么用? 就我的理解而言,我认为要使一个类成为线程安全的,我们要么使用内在锁定,要么将所有方法标记为同步的 例如,使用内在锁定的代码: } 我们可以用以下外在锁替换上面的代码: 是否建议使用上述外部锁而不是使用内部锁定使类作为线程安全?如果我的理解在这里有误,请纠正我?

  • 主要内容:1 什么是Java线程死锁,2 Java线程死锁的例子1 什么是Java线程死锁 Java中的死锁是多线程的一部分。当线程正在等待由另一个线程获取的对象锁而第二个线程正在等待由第一个线程获取的对象锁时,可能会发生死锁。由于两个线程都在互相等待释放锁,因此这种情况称为死锁。 2 Java线程死锁的例子 输出结果为:

  • 根据我在 Java 课上的知识 非静态同步方法:锁定获取特定对象 静态同步方法:类上的锁获取 我对此有点困惑,因为我们可以通过类名或对象名调用静态方法。 请假设我的类有4个方法,所有方法都是同步的。2个方法是静态的,2个不是静态的。如果我创建了我的类“对象1”的1个对象,并且还有2个线程Thread1和Thread2 问题1:如果我将尝试访问静态同步方法,使用对象1(或类名),这是否意味着“对象1