实现线程的同步互斥有三种方法:
1)synchronized语句,可以将一个代码块或者方法同步。对应的等待、唤醒操作:对象.wait()、对象.notify()
2)Lock类,面向对象的思想替换了synchronized,使用起来更加灵活。唤醒等待操作则要依赖Condition类,可以设置多个Condition
3)信号灯Semaphore,多线程工具类,当设置信号数量为1时,请功能与lock类似。acquire()、release()实现了互斥,不提供线程等待、唤醒操作。
IllegalMontitorStateException是一个RuntimeException,是一个运行错误,表明当前线程没有拥有一个线程的监视器的锁,而调用对象上的wait()、notify()方法。所以在进行线程的等待唤醒操作时要注意:
1)就是需要在调用wait()或者notify()之前,必须使用synchronized语义绑定住被wait/notify的对象,如果该对象有其他对象作为其成员变量,那么成员变量上可以调用wait()、notify()方法。
2)Condition必须与Lock配合使用,也就是不能在synchronized代码块中使用condition.notify()来唤醒线程。
|
|