多线程 synchronized volatile CAS

java多线程的内存模型 :
每个线程在运行期间都有自己独立的内存区域,用于存储变量等数据,多线程环境中,有一个内存共享区域,我们也称之为主内存,每个线程都可以访问这块区域,这块区域的变量叫共享变量。线程间的通信就是通过这主内存的共享变量来完成的。
多线程环境中,每个线程在访问共享变量时,都是从主内存将共享变量拷贝到线程的自有内存,然后线程可以对共享变量进行读写,但某个线程对共享进行写操作时,并不会立即将写操作的新值刷新至主内存,具体的刷新时机可能因不同的jvm实现而不同。所以这就会导致了内存可见性问题。
所谓内存性可见性问题是指:多个线程访读写同一个共享变量时,某个线程对共享变量的写操作,其他线程不能及时看到,导致读取的共享变量还是修改之前的值。

volatile
volatile关键字能够保证其修饰的变量在多线程环境中也能正确被读写,当一个线程对volatile类型的变量进行写操做后,处理器会立即将写后的数据刷新至主内存。当另外一个线程读取这个变量时,如果发现这个变量是volatile类型的,则处理器会将这个变量的线程区域中的变量副本置失效,然后去主内存获取最新的数据,这样就保证了其他线程对变量的修改 ,当前线程能及时可见。

synchronized
synchronized是最常见的用于同步资源访问的方式,它属于排他性的锁,可以用来同步某个方法,也可以用来同步某个代码块,当一个线程试图访问用synchronized同步的方法或者代码块时,该线程必须需要获得synchronized同步对象的锁才能进入方法或代码块,继续执行!如果未能成功获取到对象锁,刚该线程将被阻塞并进入同步队列!如果在多线程环境中,多个线程同时并发访问该对象资源时,synchronized关键字能保证只有一个线程能够获取对象锁,而其他的线程将进入同步队列中,等待已经获取对象锁的线程执行方法或者代码块完后,退出方法或代码块并释放锁后,同步队列中的线程才有机会获取锁并访问对应的资源!
当synchronized同步静态方法时,锁为该方法所在类的class对象,如果修饰的是普通方法,则锁是该类所对应的实例!如果是同步代码块, 则锁是synchronized括号里配置的对象
synchronized方法中,只允许一个线程访问对应的资源,获取锁的线程对共享变量的写操作能在释放锁后,对其他的线程是可见性的!

CAS
CAS的全名是Compare And Swap, 意思是比较并交换, 是java提供的无锁化原子更新数据的方式。CAS操作包含三个参数,需要更新数据的内存位置、第二个是预计值、第三个是要新值。CAS采用无限循环来更新数据,这种方式 有可能会循环时间过长。

你可能感兴趣的:(多线程,java,多线程,安全,内存,线程)