java中的synchronized有2个作用
互斥访问
保证内存可见性
关于第二点,总是有点疑惑,看了很多资料,一般这么描述
在同一个锁上修改,读取共享变量,读线程总是可以获取最新变量值。
后面又有 这样的描述: 线程释放锁时会将强制刷新工作内存中的脏数据到主内存中,获取一个锁将强制线程装载(或重新装载)字段的值。
这里有个链接 http://ifeve.com/syn-jmm-visibility/
其他
其实如果不存在竞争关系的话,一个变量在不同的线程按顺序访问是不存在可见性问题的