【问题标题】:Synchronizing on entire object v/s synchronizing on particular field of an object - which is a better approach在整个对象上同步与在对象的特定字段上同步 - 这是一种更好的方法
【发布时间】:2020-05-25 19:44:23
【问题描述】:

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

请用Produce方法找一个类的sn-p:-

 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。在整个对象上同步(作为注释放在代码 sn-p 中)。

哪种方法更好,为什么?

【问题讨论】:

    标签: java multithreading synchronized


    【解决方案1】:

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

    synchronized(x)x 上设置锁,因此一般情况下,您应该使用共享资源的所有线程共有的对象进行同步。如果线程使用单个公共资源(例如列表),则在该列表上同步有效。如果线程共享多个资源,则必须在单独的对象上同步以控制对这些共享资源的访问。这可以是一个对象,也可以是 this,具体取决于上下文。

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

    【讨论】:

    • 请详细说明您在上一段中提到的内容。
    • 如果多个线程以synchronized(this)块调用同一个对象,这些线程将一一进入同步块。因此,如果要以线程安全的方式修改实例变量,则此类同步块很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    相关资源
    最近更新 更多