回答
通常,方法用于保护对同时访问的资源的访问。当同时访问的资源属于您的类的每个实例时,您使用实例方法;当资源属于所有实例时(即,当它位于static
变量中)时,则使用synchronized static
方法来访问它。
例如,您可以制作一个工厂方法,该工厂方法可以保存其生成的所有对象的“注册表”。这种注册的自然地点将是一个static
集合。如果您的工厂在多个线程中使用,则需要使工厂方法(或在方法内部具有块)来保护对共享static
集合的访问。
请注意,使用而没有特定的锁对象时,通常不是最安全的选择,因为当您构建要在其他人编写的代码中使用的库时。这是因为恶意代码可能会在您的对象或类上同步以阻止自己的方法执行。为了保护你的代码不受这个影响,创建一个私有的“锁定”对象,实例或静态对象,并在该对象上进行同步。
谢谢,@dasblinkenlight为这样的用户回答,尤其是在您的图书馆中使用私人锁定对象的指导。 –
简而言之,static synchronized
方法将锁定类而不是对象,并且它将锁定类,因为关键字static
表示:“class instead of instance”。
关键字表示一次只有一个线程可以访问该方法。
而static synchronized
意味着:
只有一个可以同时访问类。
另请参阅更多详细信息 - http://www.javatpoint.com/static-synchronization-example – amar
最好的只有4行:) – roottraveller
在运行时,每个类都有一个Class
对象的实例。这是由static synchronized
方法锁定的对象。 (任何同步的方法或块必须锁定一些对象。)
如果需要(无论是否在静态方法中),还可以手动同步此对象。这两种方法的行为相同:
class Foo {
static synchronized void methodA() {
// ...
}
static void methodB() {
synchronized (Foo.class) {
// ...
}
}
}
Hats off ...这个话题不是很清楚util我看过你的答案。即使是java doc也没有像你那样看起来像..... –
- 1. Java - 同步静态方法
- 2. java静态同步方法
- 3. 什么是静态方法同步吗?
- 4. 当在同步方法或java中使用静态成员
- 5. 静态同步方法与非静态同步方法
- 6. 为什么你不能在Java中使用相同方法签名的静态和非静态方法?
- 7. 同步静态方法
- 8. 静态同步方法
- 9. Java的同步,并通过多线程使用静态同步方法
- 10. 在Java中使用静态方法和实例方法的方式有什么不同。
- 11. 访问静态字段的Java同步和静态同步方法
- 12. 在以下语法中使用方括号“[]”有什么用途
- 13. 在IValueConverter接口中使用ConvertBack方法有什么用途?
- 14. 关于静态和非静态方法的Java同步
- 15. 为什么Java在抛出java.lang.IllegalMonitorStateException时以静态方式调用wait()同步块?
- 16. 在Java中,不使用静态或类变量的方法需要同步吗?
- 17. 静态同步方法vs静态方法,所有代码都在同步块中
- 18. 同步静态方法在Java中如何工作?
- 19. 如何在Java中同步静态方法
- 20. 静态方法和非静态方法有什么区别?
- 21. 具有静态方法的静态类和具有静态方法的常规类之间有什么不同?
- 22. 调用静态方法在Java中
- 23. 在java中调用非静态方法
- 24. 线程中的静态同步和非静态同步方法行为差异
- 25. java中的静态方法可以调用非静态方法
- 26. 为什么静态最终变量使用静态方法初始化需要同步?
- 27. Java中的ByteBuffer有什么用途?
- 28. java中的hypen( - )有什么用途
- 29. 为什么允许静态方法调用私有方法?
- 30. 为什么在Java中调用静态方法没有被创建?
任何“同步”的方法或块上的条目,使得仅一次一个线程可以执行该方法/块(相对于锁定对象)“锁定”。此外,一次只能有一个线程执行*锁定在同一个对象上的任何*方法/块。一个静态同步方法被锁定在Class对象上。 –
@Zavior我不认为它是重复的 - 你所关联的问题是关于“它是如何完成的”,而这个问题是关于“为什么这样做”。 – dasblinkenlight
@dasblinkenlight我认为你是对的 – Zavior