JAVA 内存模型温故,随笔记录

来源:互联网 发布:JAVA得到数据库表结构 编辑:程序博客网 时间:2024/05/24 05:36

详情见:http://ifeve.com/jmm-faq/

1.处理器内存模型

 处理器缓存一般有俩种内存模型设计,强内存模型和弱内存模型,区别就是处理器在复杂情况下是否看到相同的值,前者可以,后者否;

弱处理器中可以使用内存屏障来刷新缓存中的值,达到强处理器的功能;但是强处理器也需要使用内存屏障指令,这个指令是不对语言开放的。


2. 在多线程程序中,编译器会对程序的执行顺序做重新排列,从而导致其他线程对这个操作的延后可读。


3.编译器能够自由的以优化的名义去改变指令顺序。在特定的环境下,处理器可能会次序颠倒的执行指令。数据可能在寄存器,处理器缓冲区和主内存中以不同的次序移动,而不是按照程序指定的顺序。

4大部分情况下,一个线程不会关注其他线程正在做什么,但是当它需要关注的时候,这时候就需要同步了。

5.没有正确的同步是指,当一个线程对同一变量有写操作,而另外的线程对这个变量有读操作,如果没有正确的同步,会导致数据竞争。

6.同步执行完成后,我们就释放了这个监视器,这个监视器有刷新缓冲区到主内存的效果,这样就会对其他线程可见,这种现象并不止对多处理器有作用,对单一处理器也有同样的效果,因为单处理器会做对程序代码的执行做优化处理。前提是在相同的监视器上做同样的操作。例如

synchronized (new Object()) {}
无效

7.volatile用于线程间做信号量,适合对volatile变量写操作较少且新值不依赖旧值的应用,可以减少了线程间同步开销。synchronized适合多线程对共享变量的并发访问。

8.单例正确的方式

private static class LazySomethingHolder {  public static Something something = new Something();}public static Something getInstance() {  return LazySomethingHolder.something;}

0 0
原创粉丝点击