4

如果我有类似下面的东西,那里面是什么意思synchronized block

synchronised (syncObject) {

基本上,这意味着只有一个线程可以在上述块内,一旦一个线程完成执行,第二个线程将进入该同步块synchronized (syncObject)。正确的?谁能用外行语言向我解释,以便我能得到更好的画面?

private static final class Task implements Runnable {
{
  private static Object syncObject = new Object();

    public Task(Command command, BlockingQueue<Integer> pool1, BlockingQueue<Integer> pool2) {
    this.command = command;
    this.existPool = pool1;
    this.newPool = pool2;
}

  public void run()
  {
    synchronised (syncObject) {
      if() {
        existId = existPool.take();
        attributeMethod(existId);
        } else if() {
            newId = newPool.take();
            attributeMethod(newId);
        }
    }
  }
}

// So I need to make this method synchronized or not? Currently I have made this synchronized
private synchronized void attributeMethod(int range) {
    // And suppose If I am calling any other method here-

 sampleMethod();
}


// What about this method, I need to make this synchronized as well? or not?
private synchronized void sampleMethod() {


}
4

2 回答 2

10

基本上,这意味着只有一个线程可以在上述块内,一旦一个线程完成执行,第二个线程将进入该同步块同步(syncObject)。正确的?

正确的!

所以我需要让这个方法同步还是不同步?

不,你没有。假设该方法只会从方法中的同步块中调用run(),该块将已经阻止多个线程同时执行该方法。所以声明该方法synchronized是多余的。

但是,我应该指出一些事情:

  • 当您将实例方法声明为synchronized时,它将同步this;即在Task物体上。但是您的synchronized块正在另一个对象上同步…… syncObject. 在这种情况下,这无关紧要。但是,如果方法中的synchronizedrun()不存在,您会发现线程正在尝试在不同的对象上同步……并且您不会得到互斥。

  • 通过在方法的顶层进行同步run()......对执行该任务的所有线程使用一个共享syncObject......您可以有效地使任务一次运行一个。这完全否定了使用线程的任何好处。

  • 最好将包含私有锁对象(例如syncObject)的变量声明为final。这避免了某些东西可能覆盖它的可能性......导致同步失败。

于 2012-08-21T01:28:23.013 回答
1

不,attributeMethod已经在一个synchronized块的范围内运行;无需将其标记为这样,除非您打算在此块之外同时调用它。

于 2012-08-21T01:09:23.847 回答