一、竟态条件引起了问题!
当多个线程执行顺序的不同会影响程序运行的结果时,产生了竟态条件。
- 竟态条件可能是潜伏的,在一定条件下才会出现的
- 程序员不应该让程序中存在竟态条件,——需要适当的同步!
二、同步和互斥锁
- java中用synchronized关键字——利用对象互斥锁。
- synchronized作用在“一个对象”上,既获取“一个对象”的对象锁。
- 作为一个原则:不要选择在锁的作用域中改变值的实例变量作为锁对象。好难理解,举例说明如下:
synchronized(obj1){
...
obj1 = obj2;
...
}
obj1就不适合做锁对象,随便一个原因,obj2=null,synchronized(null)就会抛出异常。
三、同步块——锁的作用域
以下几点需要注意,并在实际的程序中应用。
- 锁的作用域大,产生死锁的机会就很大
- 嵌套锁。可以锁任意的一段代码,不需要管是否已经获取了对象的锁。
synchronized (this) {
synchronized (this) {
。。。。。
}
}