开发者社区> 问答> 正文

synchronized的实现原理是什么?

synchronized的实现原理是什么?

本问题来自阿里云开发者社区的【11大垂直技术领域开发者社群】。 点击链接欢迎加入感兴趣的技术领域群。

展开
收起
游客pklijor6gytpx 2019-11-11 14:32:51 9990 0
4 条回答
写回答
取消 提交回答
  • 通过信号量实现当前区块内的内容只能由唯一线程访问

    2020-08-03 20:42:35
    赞同 展开评论 打赏
  • 技术架构师 阿里云开发者社区技术专家博主 CSDN签约专栏技术博主 掘金签约技术博主 云安全联盟专家 众多开源代码库Commiter

    线程安全两种,显式锁lock,同步关键字

    2020-01-04 23:18:20
    赞同 展开评论 打赏
  • Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。

    同步语句块的实现使用的是monitorenter 和 monitorexit 指令,其中monitorenter指令指向同步代码块的开始位置,monitorexit指令则指明同步代码块的结束位置,当执行monitorenter指令时,当前线程将试图获取 objectref(即对象锁) 所对应的 monitor 的持有权,当 objectref 的 monitor 的进入计数器为 0,那线程可以成功取得 monitor,并将计数器值设置为 1,取锁成功。如果当前线程已经拥有 objectref 的 monitor 的持有权,那它可以重入这个 monitor,重入时计数器的值也会加 1。倘若其他线程已经拥有 objectref 的 monitor 的所有权,那当前线程将被阻塞,直到正在执行线程执行完毕,即monitorexit指令被执行,执行线程将释放 monitor(锁)并设置计数器值为0 ,其他线程将有机会持有 monitor 。

    方法级的同步是隐式,即无需通过字节码指令来控制的。当方法调用时,调用指令将会 检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先持有monitor(虚拟机规范中用的是管程一词), 然后再执行方法,最后再方法完成(无论是正常完成还是非正常完成)时释放monitor。

    2019-12-11 22:18:46
    赞同 展开评论 打赏
  • 解决并发情况下数据同步访问的一个很重要的关键字。保证一个共享资源在同一时间只会被一个线程访问到时,可以在代码中使用synchronized关键字对类或者对象加锁

    2019-11-11 14:33:32
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
多线程 立即下载
原子变量与内存模型 立即下载
JAVA反射原理以及一些常见的应用 立即下载