同步两个线程不同步工作

时间:2014-07-01 09:03:19

标签: 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();
    }
}

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);
        }
    }

}

类MyObject是空类,没有任何空间。 我的问题是,为什么同步不能正常工作我同时以随机顺序打印'#'和' '而不是一个接一个地打印出来?

2 个答案:

答案 0 :(得分:5)

同步会锁定对象的监视器。在您的情况下,您正在与每个线程对象进行同步,即针对线程A的监视器的线程A锁定和针对线程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);
    }
  }
}

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

变化:

MyObject myObj;

为:

private final MyObject lock;

编辑另一种方法,它不会锁定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);
    }
}

答案 1 :(得分:0)

您可以尝试将 thread.join(),等待执行完成后的第一个线程开始下一个

public class hilos {
    public static void main(String[] args) throws InterruptedException{

        MyObject obj = new MyObject();
        Thread1 t1 = new Thread1(50,'#',obj);
        Thread1 t2 = new Thread1(50,'*',obj);

        Thread[] threads = {t1, t2}; 


        start(threads);


    }


    public synchronized static void start(Thread[] threads) throws InterruptedException{

        synchronized(threads){
            for(int i=0; i < threads.length; i++)   {
                threads[i].start();
                threads[i].join();
            }
        }

    }
}

输出:

#########
##########
##########
##########
##########*********
**********
**********
**********
**********
相关问题