简单地说,一个<code>static synchronized</code>方法将锁定类而不是对象,它将锁定类,因为关键字<code>静态</code}表示:“class而不是instance”。
关键字同步
表示一次只能有一个线程访问该方法。
和静态同步
的意思是:
一次只能有一个线程访问该类。
在运行时,每个加载的类都有一个class
对象的实例。该对象被静态同步
方法用作共享锁对象。(任何同步方法或块都必须锁定某些共享对象。)
如果需要,还可以手动同步这个对象(无论是否使用静态方法)。这三个方法的行为相同,一次只允许一个线程进入内部块:
class Foo {
static synchronized void methodA() {
// ...
}
static void methodB() {
synchronized (Foo.class) {
// ...
}
}
static void methodC() {
Object lock = Foo.class;
synchronized (lock) {
// ...
}
}
}
<code>static synchronized</code>方法的目的是当您希望一次只允许一个线程使用类的<code>静态</code}变量中存储的一些可变状态时。
如今,Java 在 java.util.concurrent
及其子包中具有更强大的并发特性,但核心 Java 1.0 构造(如同步
方法)仍然有效且可用。
通常,synchronized
方法用于保护对并发访问的资源的访问。当正在被并发访问的资源属于类的每个实例时,可以使用synchronized
实例方法;当资源属于所有实例时(即,当它位于static
变量中时),则使用同步静态
方法来访问它。
例如,您可以创建一个静态
工厂方法,该方法保留它生成的所有对象的“注册表”。这种注册表的自然位置是静态
集合。如果从多个线程使用工厂,则需要使工厂方法同步
(或在方法内部具有同步
块)以保护对共享静态
集合的访问。
请注意,当您构建一个要在他人编写的代码中使用的库时,使用没有特定锁对象的< code>synchronized通常不是最安全的选择。这是因为恶意代码可能会在您的对象或类上同步,从而阻止您自己的方法执行。为了保护您的代码不受这种影响,创建一个私有的“锁”对象,实例或静态的,并在该对象上进行同步。
主要内容:1 什么是Java静态同步方法,2 没有静态同步方法的问题,3 静态同步方法的例子1,4 静态同步方法的例子21 什么是Java静态同步方法 如果将任何静态方法设置为synchronized(同步),则锁定的是类而不是对象。 2 没有静态同步方法的问题 假设有两个共享类(例如:Table类)的对象,分别名为object1和object2。在使用同步方法和同步代码块的情况下,t1和t2或t3和t4之间不会存在干扰,因为t1和t2都引用了一个具有单个锁,但是t1和t3或t2和t4之间可能存
问题内容: 这是我在此链接上找到的一段文字。 “避免锁定静态方法 最糟糕的解决方案是将“ synchronized”关键字放在静态方法上,这意味着它将锁定此类的所有实例。” 为什么同步静态方法会锁定该类的所有实例?它不应该锁定课程吗? 问题答案: 这是我的测试代码,表明您是正确的,并且本文有点过分谨慎: 印刷品: 因此与实例的方法无关… 当然,如果整个系统都使用这些方法,那么您可以期望它们对多线程
当两个线程同时使用不同的实例调用静态同步方法时会发生什么?可能吗?对象锁用于非静态同步方法,但静态同步方法使用什么类型的锁?
本文向大家介绍java synchronized同步静态方法和同步非静态方法的异同,包括了java synchronized同步静态方法和同步非静态方法的异同的使用技巧和注意事项,需要的朋友参考一下 java synchronized 详解 synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对
问题内容: 对于旅行预订Web应用程序,如果有100个并发用户登录,是否应该通过“同步”或“静态同步”方法来实现机票预订并生成“电子机票编号”? 问题答案: 好了,您是否知道静态方法和实例方法之间的一般区别? 唯一的区别是,在VM开始运行该方法之前,它必须获取监视器。对于实例方法,获得的锁是与您要在其上调用该方法的对象相关联的锁。对于静态方法,获取的锁与类型本身关联- 因此,其他线程将无法同时调用
我正在编写的代码需要在几个静态方法之间进行一些同步。我的目标是阻止执行这些方法中的任何一个,如果其中一个执行。例如: 现在让我们假设下面的代码是从代码中的某个地方执行的: 我的问题是: > 它实际上是同步的吗?methodA和methodB不会同时运行吗? 如果是,methodA调用methodB会不会造成死锁?