java的synchronized关键字
2010-03-03 18:50
330 查看
1.yield()/sleep()/join() java.lang.Thread
join方法等待线程运行结束sleep方法使线程阻塞一定的时间
yield方法使线程放弃一次调度机会
2.wait()/notifyAll()/notify() java.lang.Object
wait方法使线程阻塞直至其它线程调用notify或notifAllnotifyAll方法唤醒所有等在对象锁的线程
notify方法唤醒一个等在对象锁的线程
3.sleep() 与 wait()
两者都使线程阻塞,但sleep时当前线程不释放对象锁,wait时则释放对象锁4.中断
java.lang.Thread:void interrupt(),改变中断状态
static boolean interrupted(),检查并清除中断状态
boolean isInterrupted(),检查中断状态
Object.wait、Thread.sleep、Thread.join这些方法内部会不断检查中断状态的值,并抛出InterruptedException异常
//////////////////////////////////////////////////////////////////////////////////////////
java.lang.Object
每个对象有两个线程等待队列,一个是activeQueue,一个是passiveQueue
//**************************************
synchronized{ //get the monitor or added to activeQueue
} //release the monitor and choose one in activeQueue
wait
1.release monitor
2.added to passiveQueue(wait for notify/notifyAll)
3.added to activeQueue
notify/notifyAll
move one or all of passiveQueue to activeQueue
//**************************************
在调用wait时,若产生中断,仅仅是把线程从passiveQueue移到activeQueue,保证在任何情况下,synchronized块内的语句都有monitor
//////////////////////////////////////////////////////////////////////////////////////////
5.synchronized(m)使用
synchronized(m){}
相当于
//#1
Lock(m)//申请互斥变量m
//#2
UnLock(m)//释放互斥变量m
//#3
四种方式:
public class SynMutex { public static void main(String[] args) { Integer i = 0; synchronized (i) { i = 1; /*拥有对象锁的不是i *而是i所指向的对象 *这就是产生异常的原因 */ i.notify();//IllegalMonitorStateException i.notifyAll();//IllegalMonitorStateException try { i.wait();//IllegalMonitorStateException } catch (Exception ex) { ex.printStackTrace(); } } } /* * method1与method4效果是一样的: * 当存在一个线程执行到SynMutex类的任一个对象实例的synchronized域时,其它线程不能执行该类的synchronized域 * * method2与method3效果是一样的: * 当存在一个线程执行到SynMutex类的某一个对象实例的synchronized域时,其它线程不能执行该对象实例的synchronized域 * (其它对象实例的synchronized域可以执行) * * method1与method2用在方法上 * method3与method4用在区块上 */ static public synchronized void method1() { } public synchronized void method2() { } public void method3() { synchronized (this) { } } public void method4() { synchronized (SynMutex.class) { } } }
5.IllegalMonitorStateException
当一个线程并不拥有一个对象的互斥锁时,如果调用wait/notifyAll/notify就会产生这个异常。public class SynMutex { public static void main(String[] args) { Integer i = 0; synchronized (i) { i = 1; /*拥有对象锁的不是i *而是i所指向的对象 *这就是产生异常的原因 */ i.notify();//IllegalMonitorStateException i.notifyAll();//IllegalMonitorStateException try { i.wait();//IllegalMonitorStateException } catch (Exception ex) { ex.printStackTrace(); } } } }
6.用pthread API模拟synchronized wait notify/notifyAll
synchronized(obj){ ——》pthread_mutex_lock(obj.mutex)} ——》pthread_mutex_unlock(obj.mutex)
obj.wait() ——》pthread_cond_wait(obj.cond,obj.mutex.);
obj.notify() ——》pthread_cond_signal(obj.cond)
obj.notifyAll ——》pthread_cond_broadcast(obj.cond)
pthread_cond_wait(c,m)做了以下三件事
1.释放互斥锁m
2.获取条件变量c
3.获取互斥锁m
相关文章推荐
- Java多线程基础--04之 synchronized关键字
- java多线程编程之使用Synchronized关键字同步类方法
- java synchronized 关键字(2)对象监视器为class
- java synchronized 关键字(3)对象监视器Object与class同时使用
- Java线程同步中关键字synchronized详述
- 尝试在C++里实现 Java 的 synchronized 关键字
- java synchronized关键字
- java synchronized关键字的用法
- Java的synchronized关键字:同步机制总结
- Java的synchronized关键字:同步机制总结(转载)
- Java中竞态条件和使用synchronized关键字同步
- JAVA -- 关键字 abstract、static、final、native、synchronized
- Java多线程(3)——同步与synchronized关键字
- java的synchronized关键字
- Java关于Synchronized关键字在不同位置使用的理解
- JAVA中关键字synchronized 和volatile的区别及用法
- java中synchronized关键字的用法
- Java的3个问题:synchronized方法、volatile关键字、及内部类
- Java 关键字volatile 和synchronized的作用
- [java] java synchronized 关键字详解