java - 同步Java线程:同步块

  显示原文与译文双语对照的内容

我需要一些帮助,以确保我理解同步块。 假设以下示例:


public class ThreadStarter {


 public static void main(String[] args) {



 Queue queueObject = new Queue();



 ThreadA thread1 = new ThreadA(queueObject);


 ThreadA thread2 = new ThreadA(queueObject);



 ThreadB thread3 = new ThreadB(queueObject);


 ThreadB thread4 = new ThreadB(queueObject);



 thread1.start();


 thread2.start();



 }


}



public class Queue {



 Object[] the theQueue;



 public Queue(int size){


 theQueue = new Object[size];


 }



 public submitObject(Object o){


/* add Object to the queue */


 }



 public deleteObject(int objectId){


/*delete Object from the queue */


 }


}



public class ThreadA extends Thread {



 private Queue queue;



 public ThreadA(Queue queue){


 this.queue = queue;


 }



 public void run() {


 while(!isInterrupted()){


 synchronized(queue) {


 Object o = new Object


 queue.submitObject(o);


/* do some other stuff */


 }



 try {


 sleep((int)(Math.random()*1000));


 } catch (interruptedException) {


 Thread.currentThread().interrupt;


 }



 synchronized(queue) {


/* do some other stuff on the queue */


 }


 }


 }


}



public class ThreadB extends Thread {



 private Queue queue;



 public ThreadB(Queue queue){


 this.queue = queue;


 }



 public void run() {


 while(!isInterrupted()){


 synchronized(queue) {


 queue.deleteObject(o);


/* do some other stuff */


 }



 try {


 sleep(1000);


 } catch (interruptedException) {


 Thread.currentThread().interrupt;


 }


 }


}


}



我的问题是,是否足以同步ThreadA中的整个队列对象以将对象提交到队列类,以便在安全边上。 我在ThreadB中完成了相同的操作,从队列中对对象进行 delete 操作。 还是我必须在队列类中同步 submitObject() 和 deleteObject() 方法?

在我的理解中,如果在上面所示的线程中锁定整个队列类,我应该在安全边上。

greetZ并预先感谢。

时间: 原作者:

你所需要做的就是确保没有两个线程同时在 submitObject & deleteObjecct中进入。 要实现这一点,只需将这些方法声明为同步。 在这种情况下,在类之间共享的队列对象将阻止 2个线程同步到同步的块中。

如果需要,还需要具有某种阻止机制,例如:

"如果线程想要 delete,则必须等待,如果队列中没有这样的对象,则必须等待。"

然后,你需要执行的操作不仅仅是同步: 两个方法应该同步,但是在deleteObject中输入的线程应该通过队列停止,直到对象变为可用:


public synchronized deleteObject() {


 while( isEmpty() ) {


 try {


 wait();


 } catch( Exception ex ) {


 ex.printStackTrace();


 }//catch


 }//while



//actually do delete object.


. . .


}//met



然后,submitObject应通过以下操作在等待状态中通知线程:


public synchronized submitObject() {


//do put object


. . .


 notifyAll();


}//met



还可以跨越角色并在两个方法中添加一些代码,如果队列已经满,则在队列中留下一些空格。

原作者:
...