Java Thread 注意事项

  1. 该同步要同步
  2. 同步块尽可能的小
  3. 循环内使用wait()
  4. synchronized (obj) {
        while (condition) {
            obj.wait();
        }
    }
    因为唤醒后,条件是否满足还不一定,所以还需要再次检查。
  5. notifyAll()优先于notify()
  6. yield()不可靠
  7. 在持有锁的时候, 尽量不要调用其它对象的方法(这些方法可能也是同步过的), 因为这很可能是死锁的源头.
  8. 对象锁:使用对方法进行synchronized时,线程进入该方法前需先获得该对象上的同步锁。所以,即使另外一个线程调用的是该对象上的另一个方法,因为此时该对象锁已被另一线程占有,所以该线程还是要排队等候以占有对象锁。
    由于线程进入非同步方法并不需要占有锁,所以非同步方法并不会被该对象上的同步方法所阻塞。

    对象锁:使用对方法进行synchronized时,线程进入该方法前需先获得该对象上的同步锁。所以,即使另外一个线程调用的是该对象上的另一个方法,因为此时该对象锁已被另一线程占有,所以该线程还是要排队等候以占有对象锁。由于线程进入非同步方法并不需要占有锁,所以非同步方法并不会被该对象上的同步方法所阻塞.

  9. 类锁:对静态方法进行 synchronized,那么就决定了进入该静态同步方法前,线程必须先获得类锁。类锁其实是并不存在的,原因在于类锁是基于类的class对象,每个类都有唯一的一个class对象与之对应,该类的所有实例也都拥有该唯一class对象的引用,因此,静态同步方法所使用的锁其实就是类的class对象,本质上还是一个对象锁.
  10. 基于以上两点,对象锁与类锁互不相干,因为它们的锁是完全不同的.
  11. ThreadDeath 是 Error 的子类. 调用 Thread 类中带有零参数的 stop 方法(该方法已不推荐使用)时,受害线程将抛出一个 ThreadDeath 实例.
  12. 线程优先级取决于底层实现, 应尽量避免使用.
  13. 线程结束后,再次调用该线程对象的 start() 方法会抛出异常,也就是不要重新开始一个已经执行完毕的线程.
  14. 守护线程与非守护线程的区别: 当进程中所有非守护线程已(结束或)退出时, 即使仍有守护线程在运行,进程仍将结束.
  15. Thread.UncaughtExceptionHandler接口:当线程因未捕获异常而终止时,会调用本接口的实现进行处理。Thread.setDefaultUncaughtExceptionHandler静态方法设置的是全局默认处理程序。可对单个thread、ThreadGroup对象设置未捕获异常处理程序。调用顺序是:先尝试使用thread的未捕获异常处理程序,如果该线程未设置,则使用该线程所属线程组的,如果线程组也没有设置,则使用默认的未捕获异常处理程序。
By javafuns on July 22, 2009 at 22:07 · Views: 350 · Permalink · RSS
Categorized in: Java · Tagged with: ,
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Leave a Reply


  • Highest Rated

  • My PicasaPhotos

    IMG_0521.JPG

    IMG_0869.JPG

    IMG_0618.JPG

  • RSS My del.icio.us

  • My RSS