我脑子里有一个问题,我读过类对象中的静态同步方法锁 同步方法锁定一个对象的当前实例。那么 锁上了的意义是什么呢 类对象?
有人能在这个问题上帮帮我吗?
简单地说,static synchronized方法将锁定类而不是对象,它将锁定类,因为关键字 static的意思是: “类而不是实例”。
static synchronized
static
关键字 synchronized意味着一次只有一个线程可以访问该方法。 static synchronized的意思是:
synchronized
一次只有一个线程可以访问该类。
通常,synchronized方法用于保护对并发访问的资源的访问。当一个被并发访问的资源属于你的类的每个实例时,你使用一个 synchronized实例方法; 当资源属于所有实例时(例如,当它在一个 static变量中时) ,你使用一个 synchronized static方法来访问它。
synchronized static
例如,您可以创建一个 static工厂方法,该方法保存它所生成的所有对象的“注册表”。这种注册表的自然位置是 static集合。如果从多个线程使用工厂,则需要使用工厂方法 synchronized(或者在方法内部有一个 synchronized块)来保护对共享 static集合的访问。
请注意,在构建要在其他人编写的代码中使用的库时,使用没有特定锁对象的 synchronized通常不是最安全的选择。这是因为恶意代码可能会在对象或类上同步,从而阻止您自己的方法执行。为了保护您的代码不受此影响,创建一个私有的“锁”对象(实例或静态) ,然后在该对象上进行同步。
在运行时,每个加载的类都有一个 Class对象的实例。这是 static synchronized方法用作共享锁对象的对象。(任何同步方法或块都必须锁定 一些共享对象。)
Class
如果需要,还可以手动对此对象进行同步(不管是否在静态方法中)。这三个方法的行为相同,一次只允许一个线程进入内部块:
class Foo { static synchronized void methodA() { // ... } static void methodB() { synchronized (Foo.class) { // ... } } static void methodC() { Object lock = Foo.class; synchronized (lock) { // ... } } }
static synchronized方法的预期用途是当您希望一次只允许一个线程使用存储在类的 static变量中的某些可变状态时。
如今,Java 在 java.util.concurrent及其子包中具有更强大的并发特性,但是核心 Java 1.0构造(如 synchronized方法)仍然是有效和可用的。
java.util.concurrent
静态方法可以同步。但是每个类只有一个锁。当加载相应的 java.lang.class 类对象时。静态同步方法需要该对象的锁。 因此,当您有一个静态字段应该限制多个线程同时访问时,您可以将这些字段设置为私有,并创建公共静态同步设置器或 getter 来访问这些字段。
假设一个类中有多个静态同步方法(m1,m2,m3,m4) ,假设一个线程正在访问 m1,那么同时没有其他线程可以访问任何其他静态同步方法。
JavaVM 每个类包含一个类对象。每个类可能有一些称为静态变量的共享变量。如果代码的关键部分在并发环境中使用这些变量,那么我们需要使该特定部分同步。当有多个静态同步方法时,在没有抢占的情况下,一次只执行其中一个方法。这就是类对象锁的作用。