多线程原理(2)volatile、synchronized和原子操作

java支持多个线程访问一个对象或对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个线程的执行还是可以拥有一份拷贝,来加速程序的执行,这是现代多核处理器的一个显著特性),所以程序在执行过程中,一个线程看到的变量并不一定是最新的。

在不使用关键字时,每一个线程是从自己的内存区域获取相应对象的拷贝的。(线程有自己的内存区域,默认会将共享内存中的数据拷贝到自己的内存区域)

一、volatile关键字

1、作用

关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性。

二、synchronized关键字

1、作用

关键字synchronized可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性。

2、实现原理

可以修饰代码块、方法、静态方法。实质上是对一个对象的监视器(monitor)的获取,而且这个获取过程是排他的,也就是说同一时刻只有一个线程获取由synchronized所保护对象的监视器。 任何对象都有自己的监视器,当对象由同步块或者对象的同步方法调用时,执行方法的线程必须先获取对象的监视器才能进入同步块或者同步方法,而没有获取监视器的线程会阻塞在同步块与同步方法的入口,进入BLOCKED(阻塞)状态。

多线程原理(2)volatile、synchronized和原子操作_第1张图片

由上图可以看到,任何线程对Object的访问,首先要获得Object的监视器。如果获取失败,线程进入同步队列,线程状态变为BLOCKED。当访问Object的前驱(获得了锁的线程)释放了锁,则该释放操作唤醒阻塞在同步队列中的线程,使其重新尝试对监视器的获取。 

三、原子操作

你可能感兴趣的:(多线程编程,java)