Java 同步和静态同步的区别是什么
嗯,我发现这个问题回答了好几次。答案也很常见。 静态同步方法锁定同步方法锁定实例本身的类 同一类的两个不同线程不能同时调用两个不同的同步方法。如果是呼叫,则其中一个被阻止。静态同步方法也会发生同样的情况。所以在我看来,这两种情况都显示出相同的可用性。如果有人能在这两种方法的可用性方面做出区分,这将非常有帮助。在下面的代码中Java 同步和静态同步的区别是什么,java,multithreading,static,synchronized,Java,Multithreading,Static,Synchronized,嗯,我发现这个问题回答了好几次。答案也很常见。 静态同步方法锁定同步方法锁定实例本身的类 同一类的两个不同线程不能同时调用两个不同的同步方法。如果是呼叫,则其中一个被阻止。静态同步方法也会发生同样的情况。所以在我看来,这两种情况都显示出相同的可用性。如果有人能在这两种方法的可用性方面做出区分,这将非常有帮助。在下面的代码中 不允许两个线程同时进入b方法 不允许两个线程同时进入t1.a()方法 一个线程调用t1.a()不会影响另一个线程调用t2.a() 同一类的两个不同线程不能同时调用两个不
- 不允许两个线程同时进入
方法李>b
- 不允许两个线程同时进入
方法t1.a()
- 一个线程调用
不会影响另一个线程调用t1.a()
t2.a()
synchronized
关键字时,该方法的整个主体将在this
上同步。假设我们有一个类:
class Foo {
synchronized void doSomething() { ... }
synchronized void doSomethingElse() { ... }
}
这实际上是一种简写方式:
class Foo {
void doSomething() { synchronized (this) { ... }}
void doSomethingElse() { synchronized (this) { ... }}
}
现在假设我们有两个类的实例:
final Foo f1 = new Foo(...);
final Foo f2 = new Foo(...);
当线程B在f1.doSomethingElse()中时,线程A不可能输入f1.doSomething(),但当线程B在f2.doSomethingElse()中时,线程A可以输入f1.doSomething()。这是因为f1和f2是不同的对象。synchronized
关键字仅阻止两个或多个线程在同一对象上同步
静态方法的情况略有不同。本声明:
class Bar {
static synchronized void doSomething() { ... }
static synchronized void doSomethingElse() { ... }
}
class Bar {
static void doSomething() { synchronized(Bar.class) { ... }}
static void doSomethingElse() { synchronized(Bar.class) { ... }}
}
与本声明相同:
class Bar {
static synchronized void doSomething() { ... }
static synchronized void doSomethingElse() { ... }
}
class Bar {
static void doSomething() { synchronized(Bar.class) { ... }}
static void doSomethingElse() { synchronized(Bar.class) { ... }}
}
静态
方法无法在此
上同步,因为此
不是为静态方法定义的。静态方法改为在类对象上同步
在这种情况下,一个线程在Bar.doSomething()中而另一个线程在Bar.doSomethingElse()中运行是不可能的,因为这两个方法在同一个对象(Bar.class对象)上同步。谢谢。我现在明白了