多线程之同步synchronized的使用不当造成java.lang.IllegalMonitorStateException 异常
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程之同步synchronized的使用不当造成java.lang.IllegalMonitorStateException 异常相关的知识,希望对你有一定的参考价值。
package com.bjsxt.d822.a2; public class SubThread9 extends Thread { /* * 当多个对象同时对同一个资源操作,则必须使用同步机制来控制。 * * 1、当方法去操作共享资源时,则该方法必须通过 synchronized关键字来修饰。 * 2、当方法被 synchronized 关键字修饰时,还需要 wait() 和 notify()两个方法配合使用。 * wait()方法是让当前线程对象进入等待状态。 * notify()方法是让当前线程对象对唤醒等待者。 */ private int sum = 0; @Override public synchronized void run() { String name = this.getName(); System.out.println( name + "统计员,开始统计了......."); for(int i = 1; i <= 100; i++ ){ sum += i; try { Thread.sleep( 100 ); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(name + "统计员,已将1至100的累加结果统计完毕。"); this.notify(); //唤醒等待者。 } //获取sum的值。 //public int getSum() { public synchronized int getSum() { //犯过的错误:没有写synchronized来修饰getSum()方法,以至于出现了java.lang.IllegalMonitorStateException 异常 try { System.out.println( Thread.currentThread().getName() + " 经理在这儿等待结果........"); this.wait(); //等待 } catch (InterruptedException e) { } return sum; } }
package com.bjsxt.d822.a2; public class SubThread9Test { public static void main(String[] args) { System.out.println( Thread.currentThread().getName() + " 经理,开始工作了...... "); SubThread9 st = new SubThread9(); st.setName("张三"); st.start(); System.out.println( st.getName() + " 统计员,你能把1 + 2 + 3 + ... + 100 的结果给我的吗?"); System.out.println("没问题,但您需要等一会儿。"); // try { // Thread.sleep( 15000 ); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } System.out.println("统计结果是: " + st.getSum() ); } }
因为在SubThread9类中getSum()没有用synchronized 修饰,直接写成 public int getSum(){} 而导致了异常java.lang.IllegalMonitorStateException的出现
以上是关于多线程之同步synchronized的使用不当造成java.lang.IllegalMonitorStateException 异常的主要内容,如果未能解决你的问题,请参考以下文章
Java 多线程并发编程之 Synchronized 关键字
Java多线程-synchronized同步方法及同步块简述