程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了同步是否适用于类中的所有方法还是仅适用于 1 个方法?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决同步是否适用于类中的所有方法还是仅适用于 1 个方法??

开发过程中遇到同步是否适用于类中的所有方法还是仅适用于 1 个方法?的问题如何解决?下面主要结合日常开发的经验,给出你关于同步是否适用于类中的所有方法还是仅适用于 1 个方法?的解决方法建议,希望对你解决同步是否适用于类中的所有方法还是仅适用于 1 个方法?有所启发或帮助;

例如类 1 的线程 1 访问子类 A 的同步方法 1。然后类 2 的线程 2 访问同一子类 A 的同步方法 1。这里一切正常。

如果我让类 3 的线程 3 访问子类 A 的同步方法 2,它是否仍然禁止线程 1 和线程 2 在方法 2 执行其操作时访问方法 1?如果没有,我该如何实现?

解决方法

JLS,§ 17.1 对此非常详细:

一个同步方法(§8.4.3.6)在被调用时自动执行一个锁定动作;它的主体在锁定操作成功完成之前不会执行。如果该方法是一个实例方法,它会锁定与调用它的实例相关联的监视器(即,在方法主体执行期间将被称为 this 的对象)。如果该方法是静态的,它会锁定与 Class 对象关联的监视器,该对象表示定义该方法的类。如果方法主体的执行完成,无论是正常的还是突然的,都会在同一个监视器上自动执行解锁操作。

Oracle's official tutorial on synchronized Methods 更容易理解:

...

  • 首先,对同一对象的同步方法的两次调用不可能交错。 ...

...

,

synchronized 方法只是编写主体为 synchronized 块的方法的一种快捷方式。这;

synchronized AnyType foobar(...) {
    doSomething();
}

只是一种写法的捷径;

AnyType foobar(...) {
    synchronized(this) {
        doSomething();
    }
}

可以在Java synchronized method

中找到更多详细信息

附言,

如果我有第 3 类的线程 3...

线程不是“来自类”。线程只是执行代码的对象。当你的程序创建一个新线程时,系统不记得或不关心创建它的类的什么方法,系统甚至不记得或不关心其他线程创建它。

,

你问(假设实例方法而不是静态方法):

Thread 1 ---executes--> classA.method1
Thread 2 ---executes--> classA.method1

然后

Thread 3 ---executes--> classA.method2

method1 和 method2 都是同一个类中的同步实例方法。

结果method1method2 都具有相同的监视器this 实例)并且一次一个线程将获得锁并执行 method1method2 并且没有其他线程能够执行这些方法,除非执行这些方法的线程退出并且监视器可以被锁定。

理解的关键是监视器对于所有两种方法都是相同的。

大佬总结

以上是大佬教程为你收集整理的同步是否适用于类中的所有方法还是仅适用于 1 个方法?全部内容,希望文章能够帮你解决同步是否适用于类中的所有方法还是仅适用于 1 个方法?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: