同步整个对象v / s同步对象的特定字段-这是一种更好的方法

问题描述 投票:0回答:1

在解决生产者消费者问题时,我偶然发现了一种情况,其中我可以在字段“ sharedLinkedList”或类“ SharedObject”的整个对象“ this”上进行同步。“ sharedLinkedList”是生产者和消费者线程将要处理的字段。

请使用Produce方法找到该类的片段:-

 public class SharedObject {
        LinkedList<Integer> sharedLinkedList = new LinkedList<Integer>();
        int capacity = 5;


        public void produce() {
            while (true) {
                synchronized (sharedLinkedList) {// Alternately synchronized(this)

                    try {
                        while(sharedLinkedList.size() == capacity){

                            sharedLinkedList.wait();//Alternately this.wait()
                        }
                    } catch (InterruptedException e) {

                        e.printStackTrace();
                    }

                    sharedLinkedList.add(123);
                    sharedLinkedList.notify();//Alternately this.notify
                }
            }
        }
    }

两种方法都起作用。

1。在字段“ sharedLinkedList”上同步]2。同步整个对象(在代码段中作为注释)。

哪种方法更好,为什么?

java multithreading synchronized
1个回答
0
投票

使用您显示的代码量,两种方法是等效的。这并不意味着它们在所有情况下都是等效的。

synchronized(x)设置x的锁定,因此通常,应该使用共享资源使用所有线程共用的对象进行同步。如果线程使用单个公共资源(例如列表),则在该列表上进行同步即可。如果线程共享多个资源,则必须在单独的对象上进行同步以控制对这些共享资源的访问。根据上下文,它可以是一个对象,也可以是this

[synchronized(this)还防止在类的方法之间相互排斥,因此,如果需要以线程安全的方式修改对象状态,则同步方法非常有用。

© www.soinside.com 2019 - 2024. All rights reserved.