• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Java多线程中Lock锁的使用总结

java 搞代码 4年前 (2022-01-09) 19次浏览 已收录 0个评论

多核时代

      摩尔定律告诉我们:当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18个月翻两倍以上。然而最近摩尔定律似乎遇到了麻烦,目前微处理器的集成度似乎到了极限,在目前的制造工艺和体系架构下很难再提高单个处理器的速度了,否则它就被烧坏了。所以现在的芯片制造商改变了策略,转而在一个电路板上集成更多的处理器,也就是我们现在常见的多核处理器。

      这就给软件行业带来麻烦(也可以说带来机会,比如说就业机会,呵呵)。原来的情况是:我买一台频率比原来快一倍的处理器,那么我的程序就比原来快一倍,软件工程师什么本文来源gao.dai.ma.com搞@代*码(网$也不用干。现在不一样了,我买一台双核的处理器,我的程序和原来一样慢,当然这条机器同时处理的任务可以变多了,但是对于单个任务来说并没有帮助。

      在几年前,并发(Concurrent)和并行(Paralleling)程序设计还是在少量的地方使用,现在在个人的PC机上已经是很常见了。(Concurrency and parallelism的区别参考 这个帖子)

      造个诸葛亮的价钱远远高于造三个臭皮匠!多核是在一台机器上的并发,但是单机也是会到极限,所以分布式的计算也是类似的思路,用大量普通的机器协作完成一项任务。

      但是要想编写一个正确并且高效的能利用多核的多线程程序不是件容易的是,更别说分布式的情况(网络问题,机器故障,负载均衡,。。。)。现在的编译器没有办法把单线程的程序自动编译成一个多线程的版本(如果到了那一天,估计所有的程序员就失业了)。所以只能提供一些语言上的支持(比如scala/erlang)或者mapreduce这样的框架。

      Java虽然没有提供scala那样的基于消息的模型,但是也提供了丰富的concurrent特性,并且屏蔽了平台的相关性(这不是件容易的事,比如多个处理器有自己的缓存,他们写的东西不会离开被其它处理器看到),下面我们看看java的内存模型(JMM)

JMM(Java Memory Model)

     并行程序有很多模型,比如共享内存模型,消息传递模型等等。这些模型或多或少的利用了平台相关的特性(在并行程序设计里很难回避平台的特性以便高效的通信),Java抽象出了自己的内存模型,使得开放人员看不到平台的差异(这不是件容易的事),不过即使这样,和传统程序不同,我们还是不能完全不了解一些体系架构的细节问题,至少我们得了解一些。

     在共享内存的多处理器体系架构里(我们现在用的服务器甚至笔记本都是),每个处理器都有自己的局部缓存并定期的使之与内存同步。不同的处理器架构保证了不同程度的缓存一致性(cache coherence),所以操作系统,编译器和运行时环境必须一起努力来弥补平台的差异性。

      让每个处理器都知道其它处理器的状态的代价是非常昂贵的,所以大多数架构都不会保证一致性,这通常不会有什么问题:进程/线程直接并不共享信息,编译器可以调整代码执行顺序以便提高效率,我们都很开心。当然也有需要在线程之间进行同步的时候,比如某个线程要读取到另一个线程写入的信息,这个时候缓存里的数据就得同步到内存里才行。所以这些体系架构都提供了一些指令来完成数据的同步(当然这些指令是非常费时的,能不做就尽量不做)。这些指令一般叫做memory barriers or fences。当然只是很底层的一些东西,所幸Java提供了一些高层的抽象,让我们的生活变得容易一些。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Java多线程中Lock锁的使用总结

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址