不同的线程都在等待对方的线程结束而不放弃,造成了大家都在等待情况叫做死锁。
public class deadLocker {
public static void main(String[] args) {
StringBuilder sb1=new StringBuilder();
StringBuilder sb2=new StringBuilder();
new Thread(){
@Override
public void run() {
synchronized (sb1){
sb1.append("a");
sb2.append("b");
synchronized (sb2){
sb1.append("a");
sb2.append("b");
System.out.println(sb1);
System.out.println(sb2);
}
}
}
};
new Thread(){
@Override
public void run() {
synchronized (sb1){
sb1.append("c");
sb2.append("d");
synchronized (sb2){
sb1.append("c");
sb2.append("d");
System.out.println(sb1);
System.out.println(sb2);
}
}
}
};
}
}
四个条件同时发生触发死锁
死锁在程序内部形成很难人为干预
jdk5.0引入的锁,是一种接口更加灵活
public class sale2 {
public static void main(String[] args) {
salePic2 s1=new salePic2();
salePic2 s2=new salePic2();
salePic2 s3=new salePic2();
s1.start();
s2.start();
s3.start();
}
}
class salePic2 extends Thread {
static int total=10;
//ReentrantLock时JUC中的可重复锁,创建锁的实例,确保多个线程共用一个锁,声明为static
private static final ReentrantLock rl= new ReentrantLock();
@Override
public void run() {
while(total>0){
//重复锁调用锁的方法
rl.lock();
try {
show();
}finally {
//重复锁调用解锁的方法,必须确保最后解锁的执行
rl.unlock();
}
}
}
public static void show(){
if (total>0){
System.out.println(Thread.currentThread().getName()+"售出第"+total+"张票");
total-=1;
}
}
}
synchronized同步方法 | 锁的同步方式 |
---|---|
不管同步代码块还是同步方法都是在{}结束后释放对同步监视器的调用 | 通过两个方法控制需要同步的代码 |
提供了多种实现类,适用于更多的复杂场景,效率更高 |
推荐阅读: