Java Thread 注意事项
- 该同步要同步
- 同步块尽可能的小
- 循环内使用wait()
- notifyAll()优先于notify()
- yield()不可靠
- 在持有锁的时候, 尽量不要调用其它对象的方法(这些方法可能也是同步过的), 因为这很可能是死锁的源头.
-
对象锁:使用对方法进行synchronized时,线程进入该方法前需先获得该对象上的同步锁。所以,即使另外一个线程调用的是该对象上的另一个方法,因为此时该对象锁已被另一线程占有,所以该线程还是要排队等候以占有对象锁。由于线程进入非同步方法并不需要占有锁,所以非同步方法并不会被该对象上的同步方法所阻塞。
对象锁:使用对方法进行synchronized时,线程进入该方法前需先获得该对象上的同步锁。所以,即使另外一个线程调用的是该对象上的另一个方法,因为此时该对象锁已被另一线程占有,所以该线程还是要排队等候以占有对象锁。由于线程进入非同步方法并不需要占有锁,所以非同步方法并不会被该对象上的同步方法所阻塞.
- 类锁:对静态方法进行 synchronized,那么就决定了进入该静态同步方法前,线程必须先获得类锁。类锁其实是并不存在的,原因在于类锁是基于类的class对象,每个类都有唯一的一个class对象与之对应,该类的所有实例也都拥有该唯一class对象的引用,因此,静态同步方法所使用的锁其实就是类的class对象,本质上还是一个对象锁.
- 基于以上两点,对象锁与类锁互不相干,因为它们的锁是完全不同的.
- ThreadDeath 是 Error 的子类. 调用 Thread 类中带有零参数的 stop 方法(该方法已不推荐使用)时,受害线程将抛出一个 ThreadDeath 实例.
- 线程优先级取决于底层实现, 应尽量避免使用.
- 线程结束后,再次调用该线程对象的 start() 方法会抛出异常,也就是不要重新开始一个已经执行完毕的线程.
- 守护线程与非守护线程的区别:当进程中所有非守护线程已(结束或)退出时,即使仍有守护线程在运行,进程仍将结束.
synchronized (obj) {
while (condition) {
obj.wait();
}
}
因为唤醒后,条件是否满足还不一定,所以还需要再次检查。
By javafuns on July 22, 2009 at 22:07 ·
Views: 210 · Permalink
Categorized in: Java · Tagged with: Java
Categorized in: Java · Tagged with: Java


(