同步功能如何在java中运行?

Zon*_*ata 11 java synchronization deadlock

自从我开始用Java编程以来,我一直在想这个(大约一年或两年).在C中,我们必须知道正确避免线程之间死锁的不同方法,因此在同步方法之间有更多的选择.

那么Java呢?当我们同步时,它如何避免将线程置于死锁状态?它在内部如何运作?死锁是否被避免,因为我们在更高级别上比在C(或C++)中同步?有关java中的死锁和同步的任何文档?

And*_*ite 15

在引擎盖下,它使用两个操作码monitorentermonitorexit在字节代码级别获取/释放JVM全局级别的对象引用上的锁定.我强烈建议您阅读Java虚拟机如何执行线程同步.


Abd*_*DMA 5

我们遇到多线程代码的主要问题是共享数据,并且我同意,concurency parallizing进程的目的并且"通常"发生在并行处理期间线程需要访问以对共享数据进行读/写操作.

java synchronized关键字允许以下内容:

它告诉JVM锁定对象的监视器或同步代码的一部分,这使它可以独占访问代码或对象的那一部分.

这是一个Singleton的例子:

public class Singleton {
    private Singleton INSTANCE;

    private Singleton() {
    }

    public Singleton getInstance() {
        if (null == INSTANCE) {
            INSTANCE = new Singleton();
        }
        return INSTANCE;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个Singleton不是线程安全的,如果一个线程试图获取一个实例,而另一个也试图做同样的事情(竞争条件),那么在此之前,第一个线程完成第二个已经拥有的实例的创建访问该getInstance()方法并创建了自己的Singleton实例,这意味着在T时刻我们应该有两个Singleton实例(当时称为multiton).

要解决这个问题,我们必须同步单例的创建行为,这可以通过自身synchronized上的if语句上面的关键字来完成INSTANCE:

public class Singleton {
    private Singleton INSTANCE;

    private Singleton() {
    }

    public Singleton getInstance() {
        synchronized (Singleton.class) {
            if (null == INSTANCE) {
                synchronized(Singleton.class) {
                   Singleton inst = new Singleton();
                   INSTANCE = inst;   
                }
            }
        }
        return INSTANCE;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是当第一个线程询问Singleton实例并且在创建期间,JVM将锁定INSTANCE的监视器,拒绝任何对INSTANCE的访问,直到线程1完成其请求.

有不同的方法来实现这一点,之前引用的书是一个很好的学习来源,javadoc也.