当我们在使用jvm锁的时候,一方面是为了减少线程的竞争,另外还有一方面就是保证共享数据的及时可见性。为了保证线程共享变量的可见性,会使用到内存栅栏,jvm设置内存栅栏,并将共享数据及时刷新到主存中保证其他线程可以获得最新变量数据。在使用内存栅栏时,程序会被禁止重排序。如下:
foo++;
bar++;
对bar变量加锁:
foo++;
synchronized(obj)
{bar++;
}
在加锁前,编译器可以同时加载两个变量的值,同时对他们的值进行+1后保存数据。在加锁后就必须先执行foo++,在处理bar++,编译无法在使用重排序的方式对程序进行优化。