从JVM理解多线程同步和调优(一) - 迫不及待的第一篇

 

多线程同步(一) - 迫不及待的第一篇synchronized

 

        相信大家面试或工作的过程中都遇到过synchronized这个关键字,尤其是面试的过程中,有时回答这类问题自己就虚了,如果没有深入或彻底的研究过这个肯定没信心,所以拿这个作为这个系列的开篇,接下来主要系统的写jvm内存模型、多线程同步和优化,当然来源于看书我还没那个能力去看源码,算是读后感或总结吧,希望对喜欢的兄弟们有所帮助,ok,进正题!

 

        synchronized作为java中的一个关键字,也是我们大家用来线程互斥访问的主要武器,先抛一个问题,下面进行解答,问:synchronized修饰变量、非static方法、static方法的区别?

 

          说明这个问题先从高层次了解下jvm内存模型,这里不说方法区、虚拟机栈、本地方法栈这么细粒度的划分(感兴趣的可以看我之前整理的http://www.evernote.com/shard/s201/sh/2a2d31b5-78a7-46e4-b681-1679572c0244/83cbd41bdbfb61c509bb8100ca03198c),(我擦,有点不好说)上图



 
 大家一看就知道了这是计算机内存模型,那么jvm内存模型和这个很类似,jvm中分为工作内存和主内存,将处理器换做线程、高速缓存换做工作内存就行了,也就是说每个线程都有自己的一个工作内存,全局有一个主内存,那么这个同步的操作就在缓存一致性这里,jvm内存模型定义了八种操作:lock、unlock、read、load、use、assign、store、write,其实
synchronized就对应这里的lock与unlock,为什么说这些,我们编写的代码synchronized最后就映射到这里的lock和unlock,用synchronized修饰的代码,经过编译后会在相应的字节码前后分别添加monitorenter和monitorexit,字节码中这两个关键字就是对lock和unlock的封装。synchronized可以修饰变量或方法,那么如果我们指定了这个对象参数,修饰的就是这个对象的reference,如果没有明确指定,那就根据synchronized修饰的是实例方法还是类方法,去取对应的对象实例或class对象来作为锁的对象,当然最终的同步操作是lock、unlock为我们完成的,这个定义在一致性协议里边。简单的说就是一个线程只有执行了lock后才能执行unlock;一个线程不能执行其它线程的unlock。

 

下一篇写下,java中另外一个关键字volatile,其实用volatile修饰的变量并不能保证多线程同步。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值