我脑子里有一个问题,我读取了锁定在类对象上的静态同步方法 和同步方法锁定对象的当前实例。那么什么是锁定的含义 在类对象上?
有人可以帮我解决这个问题吗?
答案 0 :(得分:66)
通常,synchronized
方法用于保护对同时访问的资源的访问。当并发访问的资源属于您的类的每个实例时,您使用synchronized
实例方法;当资源属于所有实例时(即它位于static
变量中),那么您使用synchronized static
方法来访问它。
例如,您可以创建一个static
工厂方法,该方法保留其生成的所有对象的“注册表”。此类注册表的自然位置是static
集合。如果您的工厂是从多个线程使用的,则需要使用工厂方法synchronized
(或方法中有synchronized
块)来保护对共享static
集合的访问。
请注意,在构建要在其他人编写的代码中使用的库时,使用没有特定锁定对象的synchronized
通常不是最安全的选择。这是因为恶意代码可以在您的对象或类上进行同步,以阻止您自己的方法执行。要保护您的代码不受此影响,请创建一个私有的“锁定”对象,实例或静态,并在该对象上进行同步。
答案 1 :(得分:52)
在运行时,每个加载的类都有一个Class
对象的实例。这是static synchronized
方法用作共享锁对象的对象。 (任何同步的方法或块都必须锁定某些共享对象。)
如果需要,您也可以手动同步此对象(无论是否采用静态方法)。这三种方法的行为相同,一次只允许一个线程进入内部块:
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
方法)仍然有效且可用。
答案 2 :(得分:36)
简单来说,static synchronized
方法将锁定类而不是对象,它将锁定类,因为关键字static
表示:“类而不是实例”。
关键字synchronized
表示一次只能有一个线程访问该方法
而static synchronized
意味着:
一次只能有一个线程访问该类。
答案 3 :(得分:0)
静态方法可以同步。但是每个班级只有一个锁。加载Java类时,将在其中提供相应的java.lang.class类对象。静态同步方法需要该对象的锁。 因此,当您有一个静态字段,应该限制它一次只能被多个线程访问时,可以将这些字段设置为私有,并创建公共静态同步的setter或getter来访问这些字段。
答案 4 :(得分:0)
假设一个类中有多个静态同步方法(m1,m2,m3,m4),并且假设一个线程正在访问m1,那么没有其他线程可以同时访问任何其他静态同步方法。
答案 5 :(得分:0)
Java VM每个类包含一个类对象。每个类可能都有一些共享变量,称为静态变量。如果代码的关键部分在并发环境中使用这些变量,那么我们需要将该特定部分设为同步。如果有多个静态同步方法,则一次只能执行其中一个,而不会抢占。这就是对类对象的锁定。