[英]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.