如何解决可见性和顺序带来的问题,这就引出了今天的主角——Java内存模型。1、什么是Java内存模型?可见性的原因是缓存,有序性的原因是编译优化。解决可见性和有序性最直接的方法就是禁用缓存和编译优化。这样虽然解决了问题,但是也导致性能优化没有了。所以,解决的办法是:想出一套规则和方法,让程序员在该禁用的时候禁用,不该禁用的时候不禁用。Java内存模型规范就是为了解决这个问题——提供禁用缓存和按需编译优化的方法。具体来说,这些方法包括三个关键字volatile、synchronized、final,以及六个Happens-Before规则,这些正是本期的重点内容。2.Happens-Before规则问:如何理解Happens-Before?A:前面操作的结果对后面的操作是可见的。但是不能理解为前一个操作发生在后一个操作之前。只要最终语义正确,编译器就可以优化任何方式。1、程序的顺序规则这个规则是指在一个线程中,按照程序的顺序,前面的操作happens-before任何后面的操作。2.volatile变量规则这个规则是指对一个volatile变量的写操作,Happens-Before后续对这个volatile变量的读操作。3.传递性规则是指如果AHappens-BeforeB,且BHappens-BeforeC,则AHappens-BeforeC。4.monitor中锁的规则这个规则指的是锁Happens-Before的解锁随后锁定锁。5.Threadstart()这个规则是关于线程启动的。意思是主线程A启动子线程B后,子线程B在启动子线程B之前可以看到主线程的运行。6.threadjoin()规则是指主线程A等待子线程B完成(主线程A是通过调用子线程B的join()方法实现的),当子线程B完成时(主线程中的join()方法AReturn),主线程可以看到子线程的操作。当然,所谓“看见”是指对共享变量的操作。疑问Q:volatile、synchronized、final可以理解为提供给程序员。六个Happens-Before规则受谁约束?A:这是对程序员的保证。按照提供的规则编写可以保证Happens-Before的语义。参考文章:Java内存模型和happens-before规则
