繁体   English   中英

Java中sync的用途是什么?

[英]What's the usage of synchronized in Java?

我已经写了几年的C ++。 并开始用Java编写。 Java中有同步语句。 这对我来说是新手,我发现了以下用法:

synchronized (NetworkManager.class) {/*some code*/}

NetworkManager myInstance = new NetworkManager();
synchronized(myInstance){/*some code*/}

我知道同步语句将阻止其他同步访问对象中的同步部分。 但是我对同步的说法感到困惑。

我的想法是,如果我想阻止某些方法,那么在第二个示例中,我应该在C ++中的myInstance上进行同步。 如果我创建另一个实例,它应该没有影响。 这个对吗?

如果正确,那么使用NetworkManager.class会发生什么? .class将返回对NetworkManager的类对象引用。 它会在哪些情况下生效? 还是会影响所有NetworkManager实例?

synchronized (NetworkManager.class) {//some code}将获得对NetworkManager类的Class object的锁定。 如果您在访问同一类对象(Networkmanager.class)时进行了同步,则这将阻止同时访问Networkmanager类的static fields and methods方法。 要么

NetworkManager myInstance = new NetworkManager();
synchronized(myInstance){//some code}

在以上两行中,您正在锁定NetworkManager类的特定实例(而不是类本身)。

使用synchronized (object) ,当前Thread将获得所提供对象的监视器锁定(并在退出块等待对象时释放它)。 如果监视器锁已由其他线程持有,则该线程将排队等待该锁,并等待其变为可用状态。 换句话说,使用同步提供了object作为互斥体的独占访问。 请注意,使用同步还提供了某些内存可见性保证。

使用synchronized (myInstance)您将锁定提供的实例。 使用相同实例的所有同步块以及该实例的synchronized实例方法将使用相同的互斥量。

当您使用synchronized (NetworkManager.class)你锁定的Class的实例NetworkManager 使用NetworkManager.class所有同步块(假设它们都来自同一ClassLoader )和NetworkManager static synchronized方法将使用相同的互斥量。

因此,使用synchronized (NetworkManager.class)不会锁定所有实例。 锁在实例或Class对象上的唯一真正区别在于,前者包括针对实例的同步方法的锁定,而后者包括针对类的同步静态方法的锁定; 在所有其他方式下,它们的工作原理相同:您锁定提供的对象。

您可能还想阅读Java Concurrency教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM