多线程中的对象锁定

时间:2019-03-25 10:57:13

标签: java multithreading

我正在尝试学习Java多线程技术,并停留在下面的代码上。(对象锁定的概念)

public class MultiThreading {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //creating threads.
        MyThread1 t1=new MyThread1();  
        MyThread2 t2=new MyThread2();  

        //start threads.
        t1.start();  
        t2.start();  

    }

}

class MyThread1 extends Thread{    
    public void run(){ 
        //PrintTable.printTable(2);  
        PrintTable p = new PrintTable();
        p.printTable1(2);
    }        
}  

class MyThread2 extends Thread{   
    public void run(){  
        //PrintTable.printTable(5);  
        PrintTable p = new PrintTable();
        p.printTable1(5);
    }  
}

Printable.java

公共类PrintTable {

    public void printTable1(int n){

           synchronized(this)
           {
               System.out.println("Started "+n);

               try{  
                     Thread.sleep(1000);  
                   }catch(Exception e){
                     System.out.println(e);
                   }  
                   System.out.println("Ended "+n);
           }


        }  

在上面的代码中,根据我的理解,如果 Thread1 正在访问方法 printTable1 ,则没有其他 Thread2 可以访问相同的< strong> printTable1 方法,直到Thread1完成执行,因为Thread1将获得对Printable对象的锁定。

但是我得到的输出是

Started 2
Started 5
Ended 2
Ended 5

应该是

Started 2
Ended 2
Started 5
Ended 5

我的概念错了吗?如果是,那么请纠正我。

2 个答案:

答案 0 :(得分:2)

您的每个线程都会创建PrintTable实例。 并且PrintTable中的代码是synchronized上的this

这意味着两个实例在两个不同的锁上同步。

答案 1 :(得分:0)

  

已同步(此)

表示您正在当前对象实例上进行同步。

问题是两个线程都创建PrintTable的新实例。

您可以使用以下(类级别锁定)代替同步的(this)

  private final static Object lock=new Object();

  synchronized (lock) {

 }