java中死锁的行为
我理解死锁并试图创建它,但代码执行成功。有人能帮我弄清楚到底发生了什么事吗java中死锁的行为,java,multithreading,locking,Java,Multithreading,Locking,我理解死锁并试图创建它,但代码执行成功。有人能帮我弄清楚到底发生了什么事吗 private static Object forLock1=new Object(); private static Object forLock2=new Object(); public static void main(String k[]){ Thread t1,t2=null; t1=new Thread(new Ru
private static Object forLock1=new Object();
private static Object forLock2=new Object();
public static void main(String k[]){
Thread t1,t2=null;
t1=new Thread(new Runnable(){
public void run(){
synchronized(forLock1){ //Acquires lock on forLock1 and waiting for forLock2
synchronized(forLock2){
for(int x=0;x<1000;x++)
System.out.println("Hello From t1 "+x);
}}
};
});
t2=new Thread(new Runnable(){
public void run(){
synchronized(forLock2){ //Acquires Lock on forLock2 will be waiting for forLock1
synchronized(forLock1){
for(int x=0;x<1000;x++)
System.out.println("Hello from t2 "+x);
}}
};
});
t1.start(); // Both the threads started at same time
t2.start();
}
}
私有静态对象forLock1=新对象();
私有静态对象forLock2=新对象();
公共静态void main(字符串k[]){
线程t1,t2=null;
t1=新线程(新可运行(){
公开募捐{
已同步(forLock1){//获取forLock1上的锁并等待forLock2
已同步(锁定2){
对于(int x=0;x主方法一个接一个地启动线程。第一个线程在第二个线程开始运行之前获得两个锁的可能性非常高。@ThomasKläger-谢谢,但是决定获得锁的可能性的因素是线程1在线程2之前。因为代码在第一个锁之后获得第二个锁,两个锁之间的间隔可能只有微秒,因此另一个线程介于两者之间的可能性非常小。由于线程1在线程2之前启动,因此线程1很可能赢得获得锁的竞争。请尝试添加thread.sleep(100)
在synchronized
语句之间,很可能导致死锁。您的评论说,“两个线程同时启动”,但实际上,您的代码首先一个接一个地启动两个线程。它们几乎同时启动,…对于“close”的某些定义而言但是,在一个时间尺度(例如,秒)上看起来“关闭”的东西在另一个时间尺度(例如,微秒)上看起来可能远远没有关闭。正如@Andreas所说,代码死锁的机会窗口最多只有几微秒。