关于死锁的理解
- sleep 是让线程进入阻塞状态,一定时间之后回到非阻塞状态,从而可以重新获得 CPU。
- wait 调用的时候需要先获得该 Object 的锁,调用 wait 后,会把当前的锁释放掉同时阻塞住。
在多线程环境中,死锁意味着两个或多个线程一直阻塞,等待其他线程释放锁,下面就是一个死锁的例子。
public class TestLock {
private final Object obj1=new Object();
private final Object obj2=new Object();
public static void main(String[] args) {
TestLock test=new TestLock();
test.testLock();
}
public void testLock(){
Thread t1=new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
callLock12();
}
});
Thread t2=new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
callLock21();
}
});
t1.start();
t2.start();
}
private void callLock12(){
synchronized (obj1) {
System.out.println(Thread.currentThread().getId()+"获得obj1");
sleep();
synchronized (obj2) {
System.out.println(Thread.currentThread().getId()+"获得obj2");
sleep();
}
}
}
private void callLock21(){
synchronized (obj2) {
System.out.println(Thread.currentThread().getId()+"获得obj2");
sleep();
synchronized (obj1) {
System.out.println(Thread.currentThread().getId()+"获得obj1");
sleep();
}
}
}
private void sleep() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Java中的引用类型
java.lang.ref包能用来声明软引用,弱引用和虚引用。
垃圾收集器不会回收强引用。
在内存不足时才会回收软引用,所以用它实现缓存可以避免内存不足。
垃圾收集器将会在下一次垃圾收集时回收弱引用,弱引用会被用来实现特殊的map。
java.util.WeakHashMap的key 就是弱引用。
虚引用会被立即回收,能被用来跟踪对象被垃圾回收的活动。
浙公网安备 33010602011771号