问题描述
public class ThreadTest {/** * @param args */public static Integer ticket = 1;public static void main(String[] args) {new Thread() {@Overridepublic void run() {for (int i = 0; i < 50; i++)loopThread(1);}}.start();for (int i = 0; i < 50; i++)loopThread(0);}public static void loopThread(int id) {// mainsynchronized (ticket) {if (id == ticket && ticket == 0) {System.out.println("loop 100 times for main thread"); // switch the ticket to sub threadticket = 1;ticket.notify();} else if (id == ticket && ticket == 1) {System.out.println("loop 10 times for sub thread");// switch the ticket to main threadticket=0; ticket.notify();} else {try {ticket.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}求教这个问题错在哪?错误是loop 10 times for sub threadException in thread "Thread-0" java.lang.IllegalMonitorStateExceptionat java.lang.Object.notify(Native Method)at ThreadTest.loopThread(ThreadTest.java:45)at ThreadTest$1.run(ThreadTest.java:16)请不吝赐教,拜谢。。。。
解决方案
比如System.out.println("loop 100 times for main thread"); // switch the ticket to sub thread ticket = 1; 此处ticket又是个新对象 所以接着调用 ticket.notify(); 会抛刚才的异常 即锁对象不是原来的了java.lang.IllegalMonitorStateException异常 原因就是当前线程没有获得对象的锁。此处建议使用AtomicInteger 加 自身的自增完成
解决方案二:
如果修改你这个程序,可以1.加个类class Ticket {Integer value;public Ticket(Integer value) {this.value = value;}}2.同步对象换成这个类的实例// public static Integer ticket = 1; public static Ticket ticket = new Ticket(1);3.下面的比较和赋值也都是操作Ticket类里面的value,比如...if (id == ticket.value && ticket.value == 0) {...ticket.value = 1;...这样就不会抛异常了。上面纯粹是学习用的修改,实际开发中不该这么用。不过,你这个程序多半也是学习用的吧。哈。