静态同步方法在java中有什么用?
我脑子里有一个问题。我已经读到静态同步方法锁定在类对象中,同步方法锁定对象的当前实例。那么锁定类对象的含义是什么呢?
任何人都可以在这个话题上帮助我吗?
我脑子里有一个问题。我已经读到静态同步方法锁定在类对象中,同步方法锁定对象的当前实例。那么锁定类对象的含义是什么呢?
任何人都可以在这个话题上帮助我吗?
通常,方法用于保护对并发访问的资源的访问。当同时访问的资源属于类的每个实例时,请使用实例方法。当资源属于所有实例时(即当它在变量中时),则使用方法访问它。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在java.util.concurrent
及其子包中具有更强大的并发功能,但核心Java 1.0构造(如方法)仍然有效且可用。synchronized