课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习Java编程开发语言,而今天我们就通过案例分析来了解一下,Java编程开发可见性的特点与实现。
1)总线Lock#锁。锁定总线的开销比较大,在缓存更新内存后,其他的cpu都会被锁定住,禁止与内存通信,这样开销就大了。
2)MESI协议。这是缓存一致性协议的具体实现,它通过嗅探技术识别哪个cpu想修改主内存缓存行信息,如果该缓存行是共享的,先将该缓存行刷新到主内存,再设置其他cpu的高速缓存的缓存行无效,但频繁的嗅探其他cpu想修改的共享数据,也会导致总线风暴。
什么是可见性
可见性,有序性,原子性是线程安全的三个重要指标。可见性对理解多线程非常非常非常重要!由于多核硬件架构的问题,cpu高速缓存之间本身是不可见的,必须要实现缓存一致性协议。我们刚才上面也说了硬件方面的方案,多线程对共享变量是不可见的,Java方面也提供了两个关键字来保证多线程情况下共享变量的可见性方案。
volatile实现可见性
在JVM手册中,当多线程写被volatile修饰的共享变量时,有两层语义。
1)该变量立即刷新到主内存。
2)使其他线程的共享变量立即失效。言外之意当其他线程需要的时候再从主内存取。
synchronized实现可见性
在JVM手册中,synchronized可见性也有两层语义。
1)在线程加锁时,必须从主内存获取值。
2)在线程解锁时,必须把共享变量刷新到主内存。
这两句说明了,时刻保持主内存数据新,当新的线程获取锁需要从主内存获取值。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。