0%

Java内存模型

​ Java内存模型,所有的变量都存储在主内存中,而线程拿到的变量都是从主内存中拷贝的副本。线程对所有变量的操作都是在本地内存进行,而不能直接读取主内存。

JMM

​ 多个线程访问同一个变量,并且复制到自己的本地内存对变量进行操作,很有可能两个线程使用的数据不一致,要解决这个问题,我们可以把共享变量用关键字volatile来修饰,来保证线程每次读取都是从主内存中读取数据。

volatile

​ 并发编程的三个重要特性: 原子性、可见性、有序性。

​ 原子性: 一个操作或者一系列操作,要么都成功,要么都失败,所有的操作都是一个整体,要么都执行、要么都不执行。synchronized关键字就可以保证原子性。

​ 可见性: 一个线程对共享变量进行修改,其他线程必须能够得到最新的值。即volatile关键字可保证可见性。

​ 顺序性: 编译器会优化代码,书写的代码可能和执行的代码顺序不一样,所以要保证程序的顺序,可用volatile来防止指令重排。

synchronized 和 volatile

​ synchronized保证线程同步,可以修饰类,方法,代码块,修饰类和静态方法则是给类上锁,修饰方法可以给对象上锁,修饰代码块可以指定加锁对象,可以是一个变量、对象,也可以是一个类。而volatile更加轻量级,只能修饰变量。

​ volatile只能保证数据的可见性,而不能保证原子性。

-------------本文结束感谢您的阅读-------------