同步两个线程不同步工作

Yuv*_*evy 0 java multithreading synchronized

考虑以下代码:

public class Main {

    public static void main(String[] args){
        MyObject obj = new MyObject();
        Thread1 t1 = new Thread1(100,'#',obj);
        Thread1 t2 = new Thread1(100,'*',obj);

        t1.start();
        t2.start();
    }
}
Run Code Online (Sandbox Code Playgroud)
public class Thread1 extends Thread {

    int myNum;
    char myChar;
    MyObject myObj;

    public Thread1(int num, char c, MyObject obj){
        myNum = num;
        myChar = c;
        myObj = obj;
    }

    public synchronized void run(){
        for(int i = 1; i<myNum; i++){
            if((i%10)==0)
                System.out.println("");
            System.out.print(myChar);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

MyObject类是空类,没有任何空间.我的问题是,为什么同步不起作用,我同时以随机顺序打印'#'和' '而不是一个接一个地打印

Chr*_*s K 5

同步锁定对象的监视器.在你的情况,你是对同步每个线程对象,这是线程反对对线程B的监视线程的监视和线程B锁一锁.因此他们没有互动.

我认为你的run()方法意味着以下内容:

public void run(){
  synchronized (myObj) {
    for(int i = 1; i<myNum; i++){
        if((i%10)==0)
            System.out.println("");
        System.out.print(myChar);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果这确实是你对myObj的预期用途,那么我也会建议以下改变; 因为它有助于使代码更具可读性.

更改:

MyObject myObj;
Run Code Online (Sandbox Code Playgroud)

至:

private final MyObject lock;
Run Code Online (Sandbox Code Playgroud)

编辑一种替代方法,它不会锁定myObj,而是锁定Thread1的Class实例.

public void run(){
    doJob();
}

private static synchronized void doJob() {
    for(int i = 1; i<myNum; i++){
        if((i%10)==0)
            System.out.println("");
        System.out.print(myChar);
    }
}
Run Code Online (Sandbox Code Playgroud)