0

这个问题是对这个问题的跟进,类似的问题,但执行不同,在下面的代码中,我对对象没有任何锁定。所以试图清楚地理解,我是对的还是不对的。

到目前为止,我通过阅读书籍和文章所了解的内容:-

每个 Thread 都会进入run method,并且会得到id from the various pool (existPool or newPool)依赖if, else if block,那么它会进入attributeMethod哪个必须是synchronized正确的?还有另一种attributeMethod不需要同步的方法吗?

所以假设如果第二个线程也同时启动,那么我会对下面的示例有任何问题吗?

private static final class Task implements Runnable {

    private BlockingQueue<Integer> existPool;
    private BlockingQueue<Integer> newPool;
    private int existId;
    private int newId;
    private Service service;

    public Task(Service service, BlockingQueue<Integer> pool1, BlockingQueue<Integer> pool2) {
        this.service = service;
        this.existPool = pool1;
        this.newPool = pool2;
    }
    public void run()  {
      if(service.getCriteria.equals("Previous")) {
          existId = existPool.take();
          attributeMethod(existId);
        } else if(service.getCriteria.equals("New")) {
            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 don't thinkg so, it will be synchronized as well as it will be in the scope of previous synchronized method whoever is calling, Right? or not?
    private void sampleMethod() {


    }
4

1 回答 1

1

所以假设如果第二个线程也同时启动,那么我会对下面的示例有任何问题吗?

有可能,是的,你会的。重新阅读我对上一个问题的回答中的第二个要点。

基本上,问题在于线程将在类的不同实例上同步Task......并且不会提供任何互斥。

这是否真的是一个问题将取决于线程是否需要同步。在这种情况下,线程似乎将共享ServiceBlockingQueue实例。如果这是它们共享的范围,并且您正在使用线程安全的实现类,则可能不需要同步。


我对您的建议是回到您的 Java 教科书/教程,并查看他们所说的关于synchronized原始互斥锁的实际作用的内容。它们真的很简单……但是您需要完全理解这些原语,然后才能正确地将它们组合在一起以实现您想要实现的目标。

于 2012-08-21T01:56:24.300 回答