摘要: synchronized关键字是JDK5之实现锁(包括互斥性和可见性)的唯一途径(volatile关键字能保证可见性,但不能保证互斥性,详细参见后文关于vloatile的详述章节),其在字节码上编译为monitorenter和monitorexit这样的JVM层次的原语(原语的意思是这个命令是原子执行的,中间不可中断,详细可查阅原语的概念,这里monitorenter和monitorexit是原语对,表明它们之间的代码段是原子执行的,所以保证了锁机制中的互斥性。如果反编译会发现同步函数的前面加上了monitorenter命令,而在其结束处加上monitorexit命令),JVM通过调用操作系统的互斥原语mutex来实现,被阻塞的线程会被挂起、等待重新调度,也就是如前面“用户态和内核态”章节所说的,在两个态之间来回切换,对性能有较大影响。 阅读全文
posted @ 2013-12-25 20:01 孟衡 阅读(9342) 评论(3) 推荐(1) 编辑
摘要: 在介绍CAS之前,需要先介绍操作系统实现原子性操作的两种方式:总线锁定和缓存一致性.随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性,比如处理器需要保证读一个字节或写一个字节是原子的,那么它是如何实现的呢?有两种机制:总线锁定和缓存一致性。 阅读全文
posted @ 2013-12-25 17:17 孟衡 阅读(10724) 评论(1) 推荐(1) 编辑
摘要: 这一系列多线程的文章,一方面是个人对Java现有的多线程机制的学习和记录,另一方面是希望能给不熟悉Java多线程机制、或有一定基础但理解还不够深的读者一个比较全面的介绍,旨在使读者对Java的多线程有一个递增、全面和较深刻的理解,所以在第一部分就集中介绍一些概念和原理,表面看来这些对多线程的使用没有太多关系,但理解这些概念/原理对理解多线程是至关重要的,因为Java的多线程并非是完全独自实现的,它依赖于操作系统命令、CPU机制,并且随着这些基础软硬件的发展而发展,所以请有意向对多线程全面理解的读者,请耐心地一篇一篇地看完,我尽量在介绍的过程中给予足够而又简单的介绍,如果不能理解,请查阅操作系统及CPU方面的资料。 阅读全文
posted @ 2013-12-25 14:52 孟衡 阅读(11055) 评论(0) 推荐(2) 编辑