我脑海中有一个问题。我读到过静态同步方法锁定类对象,而同步方法锁定当前对象实例。那么“锁定”类对象的意思是什么呢?
请问有人能帮我解答这个问题吗?
请问有人能帮我解答这个问题吗?
synchronized
方法用于保护被同时访问的资源。当被同时访问的资源属于类的每个实例时,您使用synchronized
实例方法;当资源属于所有实例(即它是一个static
变量)时,则使用synchronized static
方法来访问它。static
工厂方法,该方法保留它所产生的所有对象的“注册表”。这样的注册表的自然位置将是一个static
集合。如果您的工厂从多个线程中使用,则需要使工厂方法synchronized
(或在方法内部具有synchronized
块),以保护对共享static
集合的访问。synchronized
通常不是构建供他人编写的代码库时最安全的选择。这是因为恶意代码可能会在您的对象或类上同步,以阻止执行您自己的方法。为了保护您的代码免受此类攻击,请创建一个私有“锁”对象,实例或静态,并在该对象上进行同步。在运行时,每个加载的类都有一个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.util.concurrent
及其子包中,但是核心的 Java 1.0 结构,例如 synchronized
方法仍然是有效且可用的。static
方法中只使用synchronized { ... }
代码块(即没有显式指定锁对象),是否等价于并假定要使用的锁对象是类本身? - Adam Burleystatic synchronized
方法会锁定整个类而不是对象,并且它会锁定类,因为关键字 static
的意思是:"类而不是实例"。synchronized
表示一次只有一个线程可以访问该方法。static synchronized
意味着:
一次只有一个线程可以访问该类。
静态方法可以被同步。但每个类只有一个锁。当Java类被加载时,相应的java.lang.class类对象存在。这个对象的锁需要用于静态同步方法。因此,如果您有一个静态字段应该被限制为一次由多个线程访问,您可以将这些字段设置为私有,并创建公共的静态同步setter或getter来访问这些字段。
//Your object
class Y {
//Method
void method(){
//No need synchronized lines of code
synchronized (this) {
/* The lines of code *instance of an object* runing concurrently
without the outer block of code */
/* Synchronized method will execute only one current at a time if
it (the instance of the object) is concurrent and lock every other current */
}
//No need synchronized lines of code
}
}