为什么会出现线程死锁:
ps. 这里只给出java的例子,但思想都是一样的
- 使用了同步机制,资源同一时间只能被单个线程占有
- 占有的资源不可以强行剥夺(外部无法操作资源)
- 多线程互相等待彼此占有的资源锁释放
举个例子
public class DeadLockA implements Runnable{
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() +" DeadLockA :start");
while(true) {
synchronized (Cloding.b) {
System.out.println(Thread.currentThread().getName() + " DeadLockA :syn b");
Thread.sleep(2000);
synchronized (Cloding.a) {
System.out.println(Thread.currentThread().getName() + " DeadLockA :syn a");
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class DeadLockB implements Runnable {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() +" DeadLockB :start");
while(true) {
synchronized (Cloding.a) {
System.out.println(Thread.currentThread().getName() + " DeadLockB :syn a");
Thread.sleep(2000);
synchronized (Cloding.b) {
System.out.println(Thread.currentThread().getName() + " DeadLockB :syn b");
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//运行入口类
public class Cloding {
//public static Integer a = 0;
//public static Integer b = 0;
public static String a = "ok";
public static String b = "fine";
public static void main(String[] args) {
new Thread(new DeadLockA()).start();
new Thread(new DeadLockB()).start();
}
}
运行结果:
细心的可能发现了,运行入口类里面a ,b字段还有一个Integer类型的被我注释掉,我开始使用这个类型做测试,发现一直有问题,Integer类型的对象无法按照代码逻辑正常运行,怀疑Integer这种基本类型的包装类有特殊属性
Integer 的 运行结果
2018/12/27日
没有找到 Integer 锁不按代码逻辑走的原因
但是基本数据类型可以通过AtomicInteger 这种为concurrent 设计的类来解决同步问题
2020/03/05
看到有人回复我,这里给出我的理解
- a/b 之间:Integer是包装类,内部初始化了-128~127之间的值,直接赋值,会从初始化池中取对象,既然对象指向同一个,自然对象锁锁不住
- c/d之间:为什么new Integer的对象又是不同的呢?不要忘了,java语言new表示新创建对象,与是不是Integer已经无关。