//synchronized (mylist){ //synchronized 实际教监视器 中译叫锁,意思是线程进入这个空间,就必须执行完空间内的代码块才能release
mylist.add("D");
//}
同步代码块里面是原子操作,synchronized保护原子操作防止被打断,o代表是当前对象,synchronized就是对当前对象加锁,那么其他对象就无法访问该同步代码块。当o对象执行完同步代码块之后,就会将这个锁标记释放出来,然后os从就绪的线程中挑选一个线程,并且尝试获取锁标记从而进入代码块,执行原子操作。
所以synchronized虽然提供了线程安全,但是牺牲了并发效率,千军万马过独木桥。想StringBuffer 就是线程安全 StringBuilder就是线程不安全。其实所谓线程安全就是类中的方法被synchronized修饰,从而变成了线程安全。
----------------------------------------------------------死锁---------------------------------
前提:一个线程可以获取多个锁标记,那么一个线程如何获得多个锁标记呢?嵌套,
一个线程可以拿到多个对象的锁标记,每个对象都有自己的锁标记。每个对象就好比每个公用电话亭,每个电话亭门前都挂有一把锁,线程就是打电话的人,监视器就是检查打电话的人,有没有拿到当前对象的锁,只有拿到这个电话亭的锁,人才可以进去完成打电话操作。且每个线程是可以拿多个电话亭的锁,但是每个电话亭的锁每次只能给一个人用,也就是一个线程用,这就是同步代码块嵌套,就是电话停又包含一个电话亭,要想打电话,就必须拿到两个电话亭的锁标记。
Synchronized(o){
o.wait() //o对象会失去cpu以及锁标记
}