一、线程同步、锁
至于怎么用或者原理就不做太多讲述了,只总结了下要注意的点:
1、Java中每个对象都有一个内置锁;当提到同步时,应该清楚在什么上同步?也就是说,在哪个对象上同步?
2、非静态的synchronized同步方法上时,获得方法所在类的当前实例(this实例)的锁
3、静态方法同步,需要一个用于整个类对象的锁,这个对象是就是这个类(XXX.class)
4、如果实例拥有同步和非同步方法,则非同步方法可以被多个线程自由访问而不受锁的限制
5、线程Sleep时,它所持的任何锁都不会释放
6、同步损害并发性,应该尽可能缩小同步范围
看一个例子:
看这个例子,有篇文章中说,这两种方式没有任何的区别,从宏观上看确实没有区别(区别不大),因为它俩锁定的对象是一样的,但是要注意的是下面的方法在jvm里是有一个方法压栈的操作。
二、线程死锁
其实死锁理解起来还是比较容易的,就是:当两个线程或者多个线程在互相等待对方已经锁定的资源时就产生了
通过下面这段代码就比较容易理解了:
public int read() {
synchronized (resourceA) {
...
synchronized (resourceB) {
...
}
}
}
public void write(int a, int b) {
synchronized (resourceB) {
...
synchronized (resourceA) {
...
}
}
}
当一个线程执行到read()方法中的第一个“…”,另外一个线程恰好执行到write()方法的第一个“…”时就发生死锁了。
相关引用:
http://lavasoft.blog.51cto.com/62575/27069