相关疑难解决方法(0)

Java同步静态方法:锁定对象或类

Java教程说:"同一个对象上的两个同步方法的调用不可能交错."

这对静态方法意味着什么?由于静态方法没有关联对象,所以synchronized关键字会锁定类,而不是对象吗?

java methods static class synchronized

144
推荐指数
4
解决办法
10万
查看次数

同步(this)vs synchronize(MyClass.class)

可能重复:
.class的Java同步块

我正在阅读有关同步的文章.我对以下几点感到困惑,需要进一步澄清

1)用于同步块.怎么样

   synchronize(this){
    // code
   }
Run Code Online (Sandbox Code Playgroud)

不同于

   synchronize(MyClass.class){
    //code
   }
Run Code Online (Sandbox Code Playgroud)

2)同步实例方法意味着线程必须获得对实例的独占锁定,而同步静态方法意味着线程必须获取整个类的锁定(如果我错了,请纠正我).因此,如果一个类有三个方法,其中一个是静态同步的,那么如果一个线程获得该方法的锁定,那么这意味着它将获得对整个类的锁定.那么这是否意味着其他两个也将被锁定,没有其他方法可以访问这两个方法,因为整个类都有锁定?

java synchronization

25
推荐指数
2
解决办法
3万
查看次数

Java中类锁定和对象锁定的区别

人们讲述了两种类型的多线程锁定 - 对象和类.据我所知,锁定仅在对象上完成.

案例1:我们使用的工具new或工厂方法等.

void synchronized myMethod(Type param) {
  //will lock on the instance used to call this method
}
Run Code Online (Sandbox Code Playgroud)

要么

synchronized(this) {
 //will lock on current object
}
Run Code Online (Sandbox Code Playgroud)

要么

synchronized(obj1) {
 //will lock on specified obj1 object
}
Run Code Online (Sandbox Code Playgroud)

案例2:java.lang.Class对象

这称为类锁,可以与静态字段或方法或块一起使用,因为它们属于类并在所有对象和其他类属性之间共享.

static void synchronized method() {
  //will lock the Class object
}
Run Code Online (Sandbox Code Playgroud)

要么

static {
  synchronized(SomeClass.class){
    int a = 2;
  }
}
Run Code Online (Sandbox Code Playgroud)
  • 为什么我还将此视为对象锁定,因为类被加载到JVM中的方法区域中,并且类的所有静态属性都包装在java.lang.Class由JVM创建的对象中.因此抽象,它的对象锁定和图片中,我们看到类锁定.
  • 所以我还可以推断出一件事.正如一个线程锁定的对象不能被另一个线程获取,只要它不被第一个线程释放,类锁定(java.lang.Class实例)也以相同的方式工作.
  • 我想知道在同步静态方法的情况下,在以下两种情况下锁定线程获取哪个类:

    1. 从定义它的同一个类调用此方法.
    2. 从具有派生类名的派生类调用此方法.

到目前为止,这是我对这个问题的理解.请加上或纠正.

java multithreading locking thread-synchronization

7
推荐指数
2
解决办法
2万
查看次数