我是Java新手,正在阅读同步块的东西。我在其中一个语句中感到困惑,在静态类中,同步使用类实例,而普通类使用当前对象进行锁定。
现在当两个类都相同时,唯一的区别是一个类是静态的而另一个是正常的。这是否会对解释进行任何更改。
然后我的下一个问题将是我们可以通过多少方式实现同步。
谢谢
答案 0 :(得分:3)
这不是关于类 - 它是关于方法。
synchronized
方法在实例上同步; static
个没有实例,因此在相应的Class
实例上执行同步。
答案 1 :(得分:2)
您混淆了Class,static,instance以及synchronized块如何工作的概念。
一个类就像一个蓝图,该类的实例就像是蓝图中的房屋构建。您可以拥有许多根据相同蓝图构建的房屋,就像您可以拥有许多类的实例一样。一个类可以有实例方法(非静态,正常,如果你愿意)和静态方法。就像一个房子(蓝图的实现)可以有一个灯光开关功能(方法),它只在实际房屋存在时才会出现,就像非静态(实例)方法只有在你做一个实例时才可用。一类。另一方面,想象房屋蓝图有一个按钮,按下后会计算房屋的面积。这是一个可以直接在蓝图上工作的函数,但也可以在房子上使用,就像静态方法可以与(非实例化)类一起使用,但在类的实例中使用也是有意义的。
使用时的同步方法在使用它们的东西上获取锁定。如果你有一个静态方法(在非实例化的类中或从类的实例中),它将获取类的锁,因为静态方法与类(而不是实例)相关。如果你调用一个动态方法(你只能从类的一个实例做),它将获取实例上的锁,而不是类。
答案 2 :(得分:1)
实际上是静态方法与非静态方法。
可以在没有对象的情况下调用静态方法(即:no this
),因此它们使用类'对象的锁。
非静态方法使用对象的(this
)锁定。
答案 3 :(得分:0)
当静态方法同步时,锁定在“类”实例本身上完成。这意味着,如果执行了静态同步方法,则不能执行任何其他静态同步方法。
答案 4 :(得分:0)
当声明方法同步时,这意味着一次只能对该方法执行一次调用。当一个类有多个synchronized时,会创建一个同步的API,这意味着一次只能对所有这些方法进行一次调用。
静态方法不是实例方法,它意味着你不是从对象实例中调用它,而是从它自己的类中调用它。
当在并发环境中时,当有各种对象从特定对象实例调用方法时,需要同步此方法,以确保一次只发生一个。