0

我们使用什么对象来获得同步块上的锁真的很重要吗?

例如,我有 2 个代码片段,如下所示。两者都产生相同的输出。我只更改了用于锁定同步块的对象

代码 1:

package test.thread.synchronization;
public class Run1 implements Runnable{
String ts1=null;
public Run1(String ts1){
    this.ts1=ts1;
}
    @Override
public void run() {
    // TODO Auto-generated method stub
    run1Print();
}
public  void run1Print(){
    synchronized(ts1){
    for(int i =0;i<10;i++){
        System.out.println("run1Print: "+Thread.currentThread().getName()+":"+i);
    try{
    Thread.sleep(1000);
    }catch(InterruptedException e){
        e.printStackTrace();
    }
    }
    }
}
}

====

package test.thread.synchronization;
public class Run2 implements Runnable{
String ts1=null;
public Run2(String ts1){
    this.ts1=ts1;
}
@Override
public void run() {
    // TODO Auto-generated method stub
    run2Print();
}
public void run2Print(){
    synchronized(ts1){
//  System.out.println("Decrement");

    for(int i =0;i<10;i++){
        System.out.println("run2Print: "+Thread.currentThread().getName()+":"+i);
    try{
    Thread.sleep(1000);
    }catch(InterruptedException e){
        e.printStackTrace();
    }
    }
    }
}
}

=====

 package test.thread.synchronization;
 public class Ts1 {
public static void main(String[] args) {

    // Ts1 ts1 = new Ts1();
    String ts1 = "";
    Run1 tr1 = new Run1(ts1);
    Run2 tr2 = new Run2(ts1);
    Thread t1 = new Thread(tr1);
    Thread t2 = new Thread(tr2);
    t1.start();
    t2.start();
}

}

代码 2:

package test.thread.synchronization;
public class Run1 implements Runnable{
Ts1 ts1=null;
public Run1(Ts1 ts1){
    this.ts1=ts1;
}
@Override
public void run() {
    // TODO Auto-generated method stub
    run1Print();
}
public  void run1Print(){
    synchronized(ts1){
    for(int i =0;i<10;i++){
        System.out.println("run1Print: "+Thread.currentThread().getName()+":"+i);
    try{
    Thread.sleep(1000);
    }catch(InterruptedException e){
        e.printStackTrace();
    }
    }
    }
}
}

======

package test.thread.synchronization;
public class Run2 implements Runnable{
Ts1 ts1=null;
public Run2(Ts1 ts1){
    this.ts1=ts1;
}
@Override
public void run() {
    // TODO Auto-generated method stub
    run2Print();
}
public void run2Print(){
    synchronized(ts1){
//  System.out.println("Decrement");
    for(int i =0;i<10;i++){
        System.out.println("run2Print: "+Thread.currentThread().getName()+":"+i);
    try{
    Thread.sleep(1000);
    }catch(InterruptedException e){
        e.printStackTrace();
    }
    }
    }
}
}

======

package test.thread.synchronization;
public class Ts1 {
public static void main(String[] args) {

     Ts1 ts1 = new Ts1();
    //String ts1 = "";
    Run1 tr1 = new Run1(ts1);
    Run2 tr2 = new Run2(ts1);
    Thread t1 = new Thread(tr1);
    Thread t2 = new Thread(tr2);
    t1.start();
    t2.start();
}

}
4

1 回答 1

2

对象类型无关紧要,但是您应该在唯一final对象上同步,否则您可能会无意中让两个线程在两个不同对象上同步。

于 2013-07-19T14:43:05.730 回答