【问题标题】:what is Synchronized key word do in below code? [duplicate]以下代码中的同步关键字是什么? [复制]
【发布时间】:2019-04-15 04:08:10
【问题描述】:

我想知道下面代码中的同步关键字是做什么的,一个在send()方法,另一个在receive()方法。

synchronized 关键字要防止在哪些竞争条件场景/场景中?

非常感谢!

public class Data {
    private String packet;

    // True if receiver should wait
    // False if sender should wait
    private boolean transfer = true;

    public synchronized void send(String packet) {
        while (!transfer) {
            try { 
                wait();
            } catch (InterruptedException e)  {
                Thread.currentThread().interrupt(); 
                Log.error("Thread interrupted", e); 
            }
        }
        transfer = false;

        this.packet = packet;
        notifyAll();
    }

    public synchronized String receive() {
        while (transfer) {
            try {
                wait();
            } catch (InterruptedException e)  {
                Thread.currentThread().interrupt(); 
                Log.error("Thread interrupted", e); 
            }
        }
        transfer = true;

        notifyAll();
        return packet;
    }
}

【问题讨论】:

    标签: java multithreading synchronized


    【解决方案1】:

    Java 中的synchronized 关键字确保一次只能有一个线程在一个方法中。如果您熟悉其他并发模式,这相当于在方法周围放置一个信号量标志。

    在此处阅读有关它的更多信息以及一些有用的示例:https://www.baeldung.com/java-synchronized

    【讨论】:

    • Re, "...in a method..." 方法并不重要。互斥体(例如,synchronized 块)的目的是防止其他线程在一个线程正在更新它的过程中看到处于不一致状态的共享 data。有时只有一种方法接触到共享数据,保护该方法就相当于保护数据。但在其他情况下,可能有任意数量的不同方法都访问相同的数据,并且它们all必须在同一个对象上为synchronized 以实现线程安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多