Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步和静态同步的区别是什么_Java_Multithreading_Static_Synchronized - Fatal编程技术网

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对象)上同步。

谢谢。我现在明白了