Java学习:多线程(四):锁

一、synchronized锁

  • 任意对象都可以作为同步锁。所有对象都自动包含单一的锁。

  • 同步方法的锁:静态方法:使用类名.class; 非静态方法:使用this

  • 同步代码块:自行指定,大多数指定为类名.class或this

  • 保证同一个资源的多个线程共用一把锁,--->保证资源安全

会导致锁释放的情况

  1. 当前线程的同步方法、同步代码块执行结束

  2. 当前线程在同步代码块、同步方法中遇到break、return终止了代码块和该方法的继续执行

  3. 当前线程在同步代码块、同步方法中出现了未处理的Error或Exception导致异常结束

  4. 当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并且释放锁。

不会导致锁释放的情况:

  1. 线程执行同步代码块或同步方法时,程序调用Thread.sleep(),Thread,yield()方法暂停当前线程的执行

  2. 线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,不会释放锁。

    1. 避免使用suspend()和resume()来控制线程

死锁:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己所需要的同步资源,形成了线程死锁。

注:出现死锁后,不会出现异常,不会提示。但所有的线程都处于阻塞状态,无法继续执行。

如何解决死锁:

  1. 尽量避免嵌套同步

  2. 使用专门的算法

  3. 减少同步资源的定义。

示例:


版权声明:本文为m0_57753335原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。