下午:程序员
程序员须要关注的线程同步和互斥的问题。多线程
多线程的并发通常不是程序员决定,而是由容器决定。并发
多线程出现故障的缘由:线程
两个线程同时访问一个数据资源(临界资源),造成数据发生不一致和不完整。对象
数据的不一致每每是由于一个线程中的两个关联的操做只完成了一步。继承
避免以上的问题可采用对数据进行加锁的方法事件
每一个对象除了属性和方法,都有一个monitor(互斥锁标记),用来将这个对象交给一个线程,只有拿到monitor的线程才可以访问这个对象。资源
Synchronized:这个修饰词能够用来修饰方法和代码块同步
Object obj;it
Obj.setValue(123);
Synchronized用来修饰方法,表示当某个线程调用这个方法以后,其余的事件不能再调用这个方法。只有拿到obj标记的线程才可以执行代码块。
注意:Synchronized必定使用在一个方法中。
锁标记是对象的概念,加锁是对对象加锁,目的是在线程之间进行协调。
当用Synchronized修饰某个方法的时候,表示该方法都对当前对象加锁。
给方法加Synchronized和用Synchronized修饰对象的效果是一致的。
一个线程能够拿到多个锁标记,一个对象最多只能将monitor给一个线程。
Synchronized是以牺牲程序运行的效率为代价的,所以应该尽可能控制互斥代码块的范围。
方法的Synchronized特性自己不会被继承,只能覆盖。