我正在尝试学习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
我的概念错了吗?如果是,那么请纠正我。
答案 0 :(得分:2)
您的每个线程都会创建PrintTable
的新实例。
并且PrintTable
中的代码是synchronized
上的this
。
这意味着两个实例在两个不同的锁上同步。
答案 1 :(得分:0)
已同步(此)
表示您正在当前对象实例上进行同步。
问题是两个线程都创建PrintTable的新实例。
您可以使用以下(类级别锁定)代替同步的(this)
private final static Object lock=new Object();
synchronized (lock) {
}