首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java异常之IllegalMonitorStateExceptionJavaDoc解决方法:总结

也就是要在当前线程锁定对象,才能用锁定对象此行这些方法,需要用到synchronized ,锁定什么对象就用什么对象来执行 notify(), notifyAll(),wait(), wait(long...通过以下三种方法之一,线程可以成为此对象监视器所有者: 执行此对象同步 (Sychronized) 实例方法 执行在此对象上进行同步 synchronized 语句正文 对于 Class 类型对象...,执行该类同步静态方法 也就是在说,就是需要在调用wait()或者notify()之前,必须使用synchronized语义绑定住被wait/notify对象。...解决方法: 通过实现加锁方式实现线程同步时产生并发问题 1 锁定方法所属实例对象 public synchronized void method(){ //然后就可以调用:this.notify...其实异常含义是 调用wait()、notify()、notifyAll()任务调用这些方法前必须 ‘拥有’(获取)对象锁。”

33241

IllegalMonitorStateException 异常 与 Java中对象监视器Monitor和对象锁详解

当前线程锁定对象之后,才能用锁定对象执行这些方法,这里需要用到synchronized关键字,锁定哪个对象就用哪个对象来执行 notify(), notifyAll(),wait(), wait(...例如在32位HotSpot虚拟机 中对象未被锁定状态下,Mark Word32个Bits空间中25Bits用于存储对象哈希码(HashCode),4Bits用于存储对象分代年龄,2Bits用于存储锁标志...当该对象调用了notify方法或者notifyAll方法后,wait-set中线程就会被唤醒,然后wait-set队列中被唤醒线程和entry-set队列中线程一起通过CPU调度来竞争对象Monitor...被唤醒线程将以通常方式与其他线程竞争,这些线程可能正在积极地对这个对象进行同步; 例如,成为下一个锁定对象线程时,被唤醒线程没有任何特权或不利条件。...对于Class类型对象,通过执行该类同步静态方法。 每次只有一个线程可以拥有一个对象监视器。

1.7K21
您找到你想要的搜索结果了吗?
是的
没有找到

中高级Java开发面试题,最难几道Java面试题,看看你跪在第几个

虽然这可以有很多答案, 但我版本是首先我会看看代码, 如果我看到一个嵌套同步块,或从一个同步方法调用其他同步方法, 或试图不同对象上获取锁, 如果开发人员不是非常小心,就很容易造成死锁。...另一种方法使用 jConsole 或 VisualVM, 它将显示哪些线程锁定以及哪些对象锁定。...为了调用 wait(),notify() 或 notifyAll(), Java中,我们必须获得对我们调用方法对象锁定。...由于 Java 中 wait() 方法等待之前释放锁定并在从 wait() 返回之前重新获取锁定方法,我们必须使用这个锁来确保检查条件(缓冲区是否已满)和设置条件(从缓冲区获取元素)是原子,这可以通过...会抛出 IllegalMonitorStateException,如果我们不调用来自同步上下文wait(),notify()或者notifyAll()方法

1.5K10

线程和锁

当在相应线程对象上调用start()方法时,线程将启动。 线程行为,特别是没有正确同步情况下,可能会令人困惑和违反直觉。...同步(Synchronization) Java编程语言为线程之间通信提供了多种机制。这些方法中最基本同步,它是使用监视器实现。Java中每个对象都与监视器相关联,线程可以锁定或解锁监视器。...如果该方法是一个实例方法,它将锁定与它被调用实例相关联监视器(即,方法体执行期间称为this对象)。如果方法静态,则它锁定与表示定义方法对象相关联监视器。...如果线程返回时没有抛出InterruptedException异常,则它通常从等待状态返回。 设线程t是在对象m上执行wait 方法线程,设n是tm上没有与解锁操作匹配锁定操作数量。...notify 通知操作调用notify和notifyAll方法时发生。 设线程t是在对象m上执行这两种方法任何一种线程,设n是tm上没有与解锁操作匹配锁定操作数量。

44420

一题带你彻底理解 sleep() 和 wait()

放弃对象锁 C sleep暂停线程、但监控状态仍然保持,结束后会自动恢复 D wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态 关于对象锁: 截取网上一段话:...只有首先获得锁任务(线程)才能继续获取该对象多个锁。 每当任务离开一个synchronized(同步方法,计数递减,当计数为0时候,锁被完全释放,此时别的任务就可以使用此资源。...(或者synchronized块),由于这些线程进入对象synchronized方法之前必须先获得该对象拥有权,但是该对象锁目前正被线程A拥有,所以这些线程就进入了该对象锁池中。...等待池 :假设一个线程A调用了某个对象wait()方法线程A就会释放该对象锁(因为wait()方法必须出现在synchronized中,这样自然执行wait()方法之前线程A就已经拥有了该对象锁...调用 wait()之前线程必须要获得该对象对象级别锁,即只能在同步方法同步块中调用 wait()方法。进入 wait()方法后,当前线程释放锁。

1.2K10

高频多线程&并发面试题(附答案,纯干货)(一)

终止并从缓存中移除那些已有 60 秒钟未被使用线程。因此,长时间保持空闲线程池不会使用任何资源。...4.而当调用 wait()方法时候,线程会放弃对象锁,进入等待此对象等待锁定池,只有针对此对象调用 notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。...简单说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义Object类中因为锁属于对象 。 13、为什么wait和notify方法要在同步块中调用?...wait()方法强制当前线程释放对象锁。这意味着调用某对象wait()方法之前,当前线程必须已经获得该对象锁。因此,线程必须在某个对象同步方法同步代码块中才能调用该对象wait()方法。...调用对象notify()和notifyAll()方法之前,调用线程必须已经得到该对象锁。因此,必须在某个对象同步方法同步代码块中才能调用该对象notify()或notifyAll()法。

86920

多个线程之间通信问题

同步代码块中,锁对象是谁,就用那个对象来调用wait和notify 为什么wait方法和notify方法需要定义Object?      ...,锁对象是谁,就用那个对象来调用wait和notify * 为什么wait方法和notify方法需要定义Object * 因为所有的对象都是Object子类对象,而所欲对象都可以当做锁对象...2.sleep方法同步代码块中不释放锁,wait方法同步代码块中释放锁(即当前线程释放对同步监视器锁定线程由运行态变为了阻塞态也称等待态,不指定参数需要notify唤醒)。...3.使用wait方法,当前线程必须拥有此对象监视器。即有synchronized同步监视器。 4.sleep是静态方法wait方法是非静态。...5.sleep是Thread类里面定义静态方法wait方法不是Thread定义,是Object定义方法,最终由native修饰,看不到源码。

37210

楠哥教你学 Java|JUC 并发编程 002 期

wait 是 Object 类提供方法。 作用于不同对象 sleep 是让当前线程实例对象暂停执行任务。...wait 是让正在访问当前对象线程休眠,它不是针对线程对象方法,而是针对线程对象要访问资源方法,即调用 A 对象 wait 方法表示:让当前正在访问 A 对象线程暂停,同时它有一个前提,即当前线程对象必须拥有...A 对象,所以 wait 方法只能在同步方法同步块内部调用,否则会抛出 java.lang.IllegalMonitorStateException 异常。...如果 synchronized 修饰静态方法,则锁定是类,无论多少个对象调用,都会同步,如下所示。...."); } } 如果 synchronized 修饰是代码块,则锁定就是传入对象,能否实现线程同步,就看锁定对象是否是同一个对象

54320

Java多线程详解2

2、调用同一个类中静态同步方法线程将彼此阻塞,它们都是锁定在相同Class对象上。...3、静态同步方法和非静态同步方法将永远不会彼此阻塞,因为静态方法锁定在Class对象上,非静态方法锁定在该类对象上。...4、对于同步代码块,要看清楚什么对象已经用于锁定(synchronized后面括号内容)。同一个对象上进行同步线程将彼此阻塞,不同对象锁定线程将永远不会彼此阻塞。...五、何时需要同步 多个线程同时访问互斥(可交换)数据时,应该同步以保护数据,确保两个线程不会同时修改更改它。 对于非静态字段中可更改数据,通常使用静态方法访问。...对于静态字段中可更改数据,通常使用静态方法访问。 如果需要在非静态方法使用静态字段,或者静态字段中调用非静态方法,问题将变得非常复杂。已经超出SJCP考试范围了。

69870

java 为什么wait(),notify(),notifyAll()必须在同步方法代码块中调用?

当一个线程正在某一个对象同步方法中运行时调用了这个对象wait()方法,那么这个线程将释放该对象独占锁并被放入这个对象等待队列。注意,wait()方法强制当前线程释放对象锁。...这意味着调用某对象wait()方法之前,当前线程必须已经获得该对象锁。因此,线程必须在某个对象同步方法同步代码块中才能调用该对象wait()方法。...调用对象notify()和notifyAll()方法之前,调用线程必须已经得到该对象锁。...wait()与sleep()区别 sleep()方法是Thread类静态方法,不涉及到线程同步概念,仅仅为了让一个线程自身获得一段沉睡时间。sleep可以在任何地方使用。...,就要锁定对象,也就是获取对象锁,其它要使用对象线程都只能排队等着,等到同步方法或者同步块里程序全部运行完才有机会.同步方法同步块中,无论sleep()还是suspend()都不可能自己被调用时候解除锁定

1.7K10

wait(),notify(),notifyAll()_多线程wait和sleep

调用wait()之前线程必须要获得该对象对象级别锁,因此只能在同步方法同步块中调用wait()方法。进入wait()方法后,当前线程释放锁。...notify()方法可以随机唤醒等待队列中等待一个线程,并使得该线程退出等待状态,进入可运行状态 上面的例子中,wait方法与notify方法全部同步代码块中进行执行,如果不这样会出现什么样子效果呢...所以上面之所以会抛出异常,是因为调用wait方式时没有获取到monitor对象所有权。 因此执行wait与notify方法之前,必须拿到被调用对象对象锁,才可以进行等待或唤醒操作。...其用法与notify()基本一致,只不过它会唤醒一个对象监视器上等待全部线程,被唤醒线程将以常规方式与对象上主动同步其他所有线程进行竞争;例如,唤醒线程作为锁定对象下一个线程方面没有可靠特权或劣势...需要注意是,执行notifyAll之前,同样需要获取到对象锁,即必须在同步方法或者同步代码块中执行,否则会抛出IllegalMonitorStateException异常。

66010

JAVA多线程与并发学习总结

32位HotSpot虚拟机中对象未被锁定状态下,Mark Word32个Bits空间中25位用于存储对象哈希码,4位存储对象分代年龄,2位存储锁标志位,1位固定为0。...一旦线程T获得该对象锁,该对象所有同步申明都被恢复到调用wait()方法状态,然后线程T从wait()方法返回。...如果当前线程等待之前或在等待时被任何线程中断,则会抛出 InterruptedException。在按上述形式恢复此对象锁定状态时才会抛出此异常。抛出此异常时,当前线程中断状态被清除。...如果一个静态方法被申明为synchronized,则等同于在这个方法上调用synchronized(类.class)。当一个线程进入同步静态方法中时,其他线程不能进入这个类任何静态同步方法。...3.线程成为对象拥有者: 1).通过执行此对象同步实例方法 2).通过执行在此对象上进行同步synchronized语句正文 3).对于Class类型对象,可以通过执行该类同步静态方法

48121

重学 Java 基础之线程基础(二)

一个新变量只能在主内存中诞生,不允许工作内存中直接使用一个未被初始化( load 或 assign )变量。...如果锁是 this 的话,线程 A 锁是 Thread1 实例,线程 B 锁是 Thread2 实例,两个线程获取锁对象对象监视器)时候没有任何阻碍,自然也就没有同步效应了。...2、为什么要使用 TestThread.class.wait() ?notify 和 wait 需要在同步方法中执行,不然会抛出 IllegalMonitorStateException 异常。...不正确释放锁也会抛出 IllegalMonitorStateException 异常,比如没有锁定某个对象使用 wait 去释放锁就会抛出异常。...interrupt 可以终止 wait 吗我们之前不是学了一个 interrupt 方法吗?在线程 wait 时候调用线程 interrupt 方法会终止线程吗?答案是会

13910

深入理解Object提供阻塞和唤醒API

claims on this object),谨记只有当前对象同步声明会被释放,当前线程在其他对象同步锁只有调用其wait()方法之后才会释放。...被唤醒线程会与其他线程竞争在对象上进行同步(换言之只有获得对象同步控制权才能继续执行),成为下一个锁定对象线程时,被唤醒线程没有可靠特权或劣势。...此方法只有一个线程获取了此对象监视器所有权(the owner)时候才能调用,具体就是:同步方法中、同步代码块中或者静态同步方法中。...静态同步方法同步或者说锁定是当前实例对象Class对象同步代码块,同步或者说锁定是括号里面的实例对象。...,而是Class文件方法表中将该方法access_flags字段中synchronized标志位置1,表示该方法同步方法使用调用该方法对象或该方法所属ClassJVM内部对象表示Klass

92820

java并发编程(1):Java多线程-基本线程类-基础知识复习笔记

如果有比较复杂数据要处理,可以在线程目标对象中引入数据。使用这种方式获得线程名字就稍微复杂一些,需要使用到Thread中静态方法,获得当前线程对象,然后再调用getName()方法。...静态synchronized方法 与 synchronized(calss)代码块 锁定都是Class锁。Class 锁与 对象锁 不是同一个锁,两者同时使用情况可能呈异步效果。...针对多线程使用变量如果不是volatile或者final修饰,很有可能产生不可预知结果(另一个线程修改了这个值,但是之后线程看到是修改之前值)。...wait/notify属于Object类方法,但wait和notify方法调用,必须获取对象对象级别锁,即synchronized同步方法同步块中使用。...当某代码并不持有监视器使用权时(如上图状态,即脱离同步块)去wait或notify,会抛出java.lang.IllegalMonitorStateException

23910

Java进阶(三)多线程开发关键技术

wait是在当前线程持有wait对象情况下,暂时放弃锁,并让出CPU资源,并积极等待其它线程调用同一对象notify或者notifyAll方法。...实例同步方法 synchronized用于修饰实例方法(非静态方法)时,执行该方法需要获得是该类实例对象内置锁(同一个类不同实例拥有不同内置锁)。...静态同步方法 synchronized用于修饰静态方法时,执行该方法需要获得是该类class对象内置锁(一个类只有唯一一个class对象)。调用同一个类不同静态同步方法时会产生锁竞争。...此时建议不使用同步方法,而使用同步代码块,只对操作临界资源代码,也即需要同步代码加锁。...这样做好处是,当一个线程执行同步代码块时,其它线程仍然可以执行该方法同步代码块以外部分,充分发挥多线程并发优势,从而相较于同步整个方法而言提升性能。

850180

Java进阶(三)多线程开发关键技术

wait是在当前线程持有wait对象情况下,暂时放弃锁,并让出CPU资源,并积极等待其它线程调用同一对象notify或者notifyAll方法。...实例同步方法 synchronized用于修饰实例方法(非静态方法)时,执行该方法需要获得是该类实例对象内置锁(同一个类不同实例拥有不同内置锁)。...静态同步方法 synchronized用于修饰静态方法时,执行该方法需要获得是该类class对象内置锁(一个类只有唯一一个class对象)。调用同一个类不同静态同步方法时会产生锁竞争。...此时建议不使用同步方法,而使用同步代码块,只对操作临界资源代码,也即需要同步代码加锁。...这样做好处是,当一个线程执行同步代码块时,其它线程仍然可以执行该方法同步代码块以外部分,充分发挥多线程并发优势,从而相较于同步整个方法而言提升性能。

41240

java多线程编程核心技术——第四章总结

1.2使用ReentrantLock实现同步:测试2   调用了lock()方法代码线程会持有“对象监视器”,其他线程只有等待锁被释放时再次争抢,效果跟使用synchronized关键字一样,线程间还是顺序执行...1.3使用Condition实现等待/同步错误用法与解决   类ReentrantLock实现等待/同步功能,需要借助于condition对象。   ...Condition类具有很好灵活性,可以实现多路通知功能:一个Lock对象中创建多个Condition(对象监视器)实例,线程对象可以注册指定Condition中,从而有选择性地进行线程通知,调度线程上更灵活...1.4正确使用Condition实现等待/通知   Object类中wait()方法相当于Condition类中await()方法。   ...2)boolean tryLcok()                仅在调用时锁定未被另一个线程保持情况下,才获得该锁定

70560

【Java并发编程】使用waitnotifynotifyAll实现线程间通信几点重要说明

Java中,可以通过配合调用Object对象wait()方法和notify()方法或notifyAll()方法来实现线程通信。...这里详细说明一下各个方法使用中需要注意几点: 1、wait() public final void wait() throws InterruptedException,IllegalMonitorStateException...调用wait()之前线程必须要获得该对象对象级别锁,即只能在同步方法同步块中 调用wait()方法。进入wait()方法后,当前线程释放锁。...4、wait(long)和wait(long,int) 显然,这两个方法是设置等待超时时间,后者超值时间上加上ns,精度也难以达到,因此,该方法很少使用。...但一般可以通过设置标志位来判断,notify之前改变标志位值,wait()方法后读取该标志位值来判断,当然为了保证notify不被遗漏,我们还需要另外一个标志位来循环判断是否调用wait()方法

36930

Java 高并发综合

synchronized修饰方法和修饰代码块时有何不同 持有锁对象不同: 修饰方法时:this引用的当前实例持有锁 修饰代码块时:要指定一个对象,该对象持有锁 从而导致二者意义不同: 同步代码块锁定范围上可能比同步方法要小...等弱一致性集合类 Collections类中有多个静态方法,它们可以获取通过同步方法封装非同步集合而得到集合,如List list = Collection.synchronizedList(new...为什么wait, notify 和 notifyAll这些方法不在thread类里面? 主要原因是JAVA提供锁是对象而不是线程,每个对象都有锁,通过线程获得。...由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义Object类中因为锁属于对象。 为什么wait和notify方法要在同步块中调用?...两个方法都可以向线程池提交任务,execute()方法返回类型是void,它定义Executor接口中, 而submit()方法可以返回持有计算结果Future对象,它定义ExecutorService

94860
领券