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所说,代码死锁的机会窗口最多只有几微秒。