1.关于线程安全类:不可变类总是线程安全的,而可变类的线程安全往往以降低并发性能为代价,注意只对可能导致资源竞争的代码进行synchronized,并且在需要提供单线程和多线程两个环境下通过继承和覆盖而在内部建立采用同步机制的内部类。
2.以下情况持有锁的线程会释放锁:
执行完同步代码块
执行同步代码块中,遇到异常导致线程终止。
执行同步代码块中,执行了锁对象所属的wait()方法。
而以下情况线程是不会释放锁的:
执行同步代码块中,执行了Thread.sleep()方法,当前线程线程放弃CPU,开始睡眠,但是不会释放锁。
执行同步代码块中,执行了Thread.yield()方法,当前线程线程放弃CPU,将执行权给线程优先级大于等于其的线程,但是不会释放锁。
执行同步代码块中,其他线程执行了当前线程对象的suspend()方法(该方法已经被废弃),当前线程线程放弃CPU,但是不会释放锁。
3.关于死锁:
JVM不监测也不试图避免死锁,因此要自己保证不出现死锁状态。一个通用的经验法则是当几个线程都要访问共享资源A、B和C时,保证使每个线程按照同样的顺序去访问它们。
责任编辑:小草