1如题,我知道wait,notify,notifyAll一定要在同步代码块中使用。但我有几个问题:
1.如下,我使用ReentrantLock作为锁,为什么会报错?
public class Task implements Runnable{
public Lock lock=new ReentrantLock();
@Override
public void run() {
try {
lock.lock();
System.out.println("wait start");
lock.wait();
System.out.println("unlock start");
lock.unlock();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
然后通过Thread类运行run,为什么会提示关于java.lang.IllegalMonitorStateException错误?
2.我使用Task类里的一个静态字符串变量,比如static String mylock="mylock",然后使用synchronized(mylock)就能正常使用wiat,notify,notifyAll了。这是为什么呢?使用wait、notify和notifyAll的的最根本的条件是什么呢?
首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:
1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;
2>当前线程不含有当前对象的锁资源的时候,调用obj.notify()方法。
3>当前线程不含有当前对象的锁资源的时候,调用obj.notifyAll()方法。
以上是网上的回答,是不是说wait、notify和notifyAll必须在synchronized(当前对象)的情况下才能使用?
一、报错的原因是因为Object类的wait方法需要释放锁来让其他线程竞争,但是lock.lock()让lock对象拿到了这把锁,但是还没有走到lock.unlock()让lock对象释放这把锁,当前线程需要释放锁但是lock对象还没释放锁(也就是说当前线程并没有拿到这把锁),所以就报了java.lang.IllegalMonitorStateException
二、使用wait、notify和notifyAll最根本的条件就是在同步块或者同步方法里,使用synchronized也行,使用lock也行,只要保证同步块内的代码在同一时间只有一个线程能执行就可以,事实上你定义一把锁不一定非得是字符串,只要是一个对象就行,因为wait方法是Object类就有的。
本文向大家介绍Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll),包括了Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll)的使用技巧和注意事项,需要的朋友参考一下 本篇我们来研究一下 wait() notify() notifyAll() 。 DEMO1: wait() 与 notify() DEMO1 输出: 注意: 使用 wait
从逻辑上讲,调用< code>wait方法的线程应该已经获得了正在调用< code>wait的对象的固有锁。 oracle教程中提到“在对象的同步方法中调用< code>wait是获取内部锁的一种简单方法”,这意味着至少还有另一种方法可以获取锁。 我的问题是,为了调用< code>wait,除了在synchronized方法内部调用< code>wait之外,还有其他方法可以获取内部锁吗?...它
问题内容: 如何在不是线程的对象上调用和方法?那真的没有道理,对吗? 当然,这一定是有道理的,因为这两种方法可用于所有Java对象。有人可以提供解释吗?我在理解如何使用和进行线程之间通信时遇到麻烦。 问题答案: 锁定是关于保护共享数据。 锁位于要保护的数据结构上。线程是访问数据结构的事物。锁位于数据结构对象上,以防止线程以不安全的方式访问数据结构。 任何对象都可以用作内部锁(与结合使用)。这样,您
从这段代码中我可以理解,一个线程一旦进入方法,就获取inst1上的锁,然后获取inst2上的锁,而不释放inst1锁。我假设这两个对象都没有被其他线程锁定。< br> 如果一个线程一次只能获得一个对象的锁,并且在当前对象的锁被释放时只能拥有另一个锁,那么这段代码怎么可能是有效的,或者更确切地说,它是我认为我在某个地方看到的有效代码吗? 如果Type1和Type2是相同的呢? 如果我们使方法同步,考
当一个线程获得一个对象(比如类B)的监控锁时,它是否获得了属于它的超类(比如类A,其中B扩展了A)的对象的监控锁? 观察 #1 - 当一个线程(通过同步方法拥有派生对象 B 的监视器锁)在超类 A 中调用 wait() 时,第二个线程获取对象 B 的监视器锁并在 A 中进行等待。最后,两个线程同时退出 B 的对象监视器。 我的理解是线程应该在其拥有锁的对象上调用否则这将导致非法监视器状态异常。在
问题内容: 我有很多代码, 调用时处理器很小,有时会导致性能问题(100毫秒),因此我想知道当前等待对象释放的线程是什么。 我想在调用之前打印所有等待对象释放的线程 问题答案: 是否所有线程都在资源上等待相同的条件?如果是,则可以尝试替换,尽管实际上不建议这样做。AFAIK,无法“检索”在给定对象上等待的所有线程的列表(尽管您可以通过编程方式获取进程的线程转储并查看线程,但是我敢肯定那不是您拥有的