public void println(String x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
从源码可以看出在使用print方法的时候使用了关键字synchronized,为什么synchronized关键字就可以保证变量的原子性呢?
使用synchronized时所做的操作:
1、获得同步锁
2、清空工作内存
3、从主内存拷贝对象副本到工作内存
4、执行代码(计算或者输出等)
5、刷新主内存数据
6、释放同步锁。
正常情况下操作系统读取变量每次都需要从主内存里面读取,而JVM为了让程序运行更快,每个线程读取变量时都会自己缓存一份,这样就不需要每次都从主内存读取,这也导致有一个线程修改了变量的值,其他线程却不知道,造成了缓存不一致的问题,volatile关键字就可以解决这个问题
volatile是更轻量级的关键字作用在变量上面使得每次线程读取变量的值都需要直接从主内存之中读取,而不是读取线程的缓存。