java synchronized释放锁的时机

当我们使用锁同步代码的时候,会在什么时候释放锁呢

1.当前线程的同步方法、代码块执行结束的时候释放。
2.当前线程在同步方法、同步代码块中遇到break 、 return 终于该代码块或者方法的时候释放。
3.出现未处理的error或者exception导致异常结束的时候释放。
4.程序执行了 同步对象 wait 方法 ,当前线程暂停,释放锁

在以下两种情况不会释放锁

1. 代码块中使用了 Thread.sleep()  Thread.yield() 这些方法暂停线程的执行,不会释放。
2. 线程执行同步代码块时,其他线程调用 suspend 方法将该线程挂起,该线程不会释放锁 ,所以我们应该避免使用 suspend 和 resume 来控制线程 。

tips

1. 对于一个已经竞争到同步锁的线程,在还没有走出同步块的时候,即使时间片结束也不会释放锁。
2. 对象锁和类锁是两个不同的锁。在同一个类的静态方法和实例方法上都加synchronized关键字,这时静态方法的synchronized对应的是 **类锁**,实例方法的synchronized是**对象锁**。这是两个不同的锁。 实例对象调用**类锁**方法也会同步。

volatile关键字的使用

1. 关键字volatile的主要作用是使变量在多个线程间可见。
2. 关键字volatile的作用是强制用公共堆栈中取的变量的值,而不是从线程私有的数据栈中取得变量的值。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 11,371评论 4 56
  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    胜浩_ae28阅读 5,171评论 0 23
  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    小徐andorid阅读 2,876评论 3 53
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。在这之前...
    4ea0af17fd67阅读 597评论 2 17
  • 这本书让听者沉默,讲者动容。 二十岁坐上轮椅,每天在母亲的目光下去公园。当她来找的时候,躲在树后看她慌乱的表情。 ...
    Eastree阅读 121评论 0 0