java - 死锁是按方法还是按类发生?

标签 java multithreading deadlock

想象一下,我有一个带有多个同步方法的 First 类。当线程First锁定类时,它是按方法锁定还是按类锁定?例如下面的代码是否会发生死锁?

public class DeadLockQuestion {

    public static class First{
        public synchronized void a(){

        }
        public synchronized void b(){

        }
        public synchronized void c(){

        }   
        public synchronized void d(){

        }
        public synchronized void e(){

        }       
    }

    public static void main(String... args){
        First f = new First();

        //This code is run in Thread 1
        f.a();
        // End
        //This code is run in Thread 2 simultanously
        f.b();
        //End
        // We have also Threads 3 & 4 & 5 that invoke c,d and e simultanously

    }

}

最佳答案

您在 Java 中有两把锁。一是对象锁。另一个是类锁。 对象锁仅锁定对同步非静态函数的访问。类锁仅锁定同步静态函数。 对于您来说,它是对象 f 上的对象锁。因此所有同步的非静态函数都被对象f锁定。 由于所有线程都使用相同的对象 f,因此只有一个线程能够访问您的非静态函数 a(), b(),... at一次。 了解更多 here

does deadlock happen for the following code?

不,在你的情况下不会发生这种情况。因为当一个线程持有锁时,其他线程无法进入您的同步函数。由于资源而发生死锁。
您只有一个资源,即对象 f。这里没有必要出现死锁,因为 First 类不会锁定另一个对象,并且不会发生循环锁定。死锁需要循环锁!

一些信息:

  1. java中的同步保证没有两个线程可以执行同一个任务 同步方法,同时需要相同的锁或 同时。
  2. synchronized 关键字只能与方法和代码块一起使用。 这些方法或 block 可以是静态的,也可以是非静态的。
  3. 当线程进入java同步方法或阻塞它时 获取锁,并且每当它离开 java 同步方法或 阻止它释放锁。即使线程离开,锁也会被释放 同步方法完成后或由于任何错误或 异常(exception)。
  4. 静态同步和非静态都有可能 同步方法可以同时运行,因为 他们锁定不同的对象。
    有用来源Here ,和here

关于java - 死锁是按方法还是按类发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20679373/

相关文章:

java - 从后向读取Sql数据库

java - 如何使用 moxy 将 xsd 编译成一组等效的 java 对象?

python - pymysql.err.InterfaceError : (0, '' ) 对 sql 表进行大量推送时出错

java - 如何在新线程中返回值?

multithreading - 如何在不输入的情况下测试临界区是否被锁定?或者,如何等到 critsec 被另一个线程拥有?

python - 如何用python调试死锁?

java - 如何在 PHP 中复制 Java 加密?

java - 每次到达字符时在下一行打印

multithreading - Cocos,如何从后台线程渲染到CCRenderTexture

java - 如何预测Java中的死锁