Java8提供的LocalDate和DateTimeFormat是如何保证线程安全的?
分析一下源码。
LocalDate类是final类型的,也就是说,LocalDate是不可变的,一旦实例化,值就固定了。
而java8之前的Date类不是final的。
final关键字的内存语义
1,写final域的重排序规则:JMM禁止编译器把final域的写重排序到构造函数初始化之外(之后)。编译器会在final域的写之后,构造函数return之前,插入一个StoreStore内存屏障。
2,读final域的重排序规则:在一个线程中,初次读对象引用与初次读该对象包含的final域,JMM禁止重排序这2个操作。编译器会在读final域操作的前面插入一个LoadLoad屏障。
解读:读final域的重排序规则可以确保,在读一个对象的final域之前,一定会先读这个final域的对象引用。也就是说,可以确保final修饰的对象this.field==field是true。但是普通的非final修饰的对象,不能确保this.field==field是true。
看一下下面的代码,如何让n不等于n

那么我要问了,final修饰的类的实例,都是线程安全的吗?
网友评论