并发访问临界资源的修饰符volatile

    xiaoxiao2021-03-25  102

    最近有人问我多并发怎么实现数据同步,脱口而出synchronize,后来发现有点low啊,java不止提供了synchronize一种解决方式

    查资料恶补,然后实验了一下,得出这篇心得:

    1.java中为了实现并发中数据同步,提供了synchronize关键字修饰方法,修饰代码块来实现执行同一代码时同一时间段只能有一个

    线程来访问此代码块;(常用,不做赘述)

    2.java中同时提供Lock锁对象的实例来实现线程获取执行锁从而实现同步代码块,类似于synchronize{}修饰代码块(操作简单,无法获取对象锁,只能锁住指定代码块

    3.其实除了synchronizeLock之外,java还提供了修饰符volatile来修饰临界资源,从而使临界资源改变对于所有线程都是可见的,从而使线程从临界资源的角度获取一定的同步性。

    volatile

                  a,字面意思,volatile意味着不稳定的,改变的,当变量为volatile所修饰,则通知虚拟机此变量为不稳定的,当变量结果改变时,虚拟机会通知所有线程,变量的值有所改变,线程则会从新读取变量值,从而实现变量在所有线程中的可见性;

                  b,其实线程对变量值的改变经过读取、在本线程中开辟临时资源进行赋值更改回传对临界资源变量进行赋值,所以单个线程在改变临界资源变量值的过程中,临界变量并不是实时更新的,线程获取的临界变量值也不是最新的数据

    语言描述很难清晰明了,看如下代码一目了然:

    代码中变量为volatile修饰,则下面开启的线程对变量进时,虚拟机会提示所有线程变量已更改,需要重新读取改变后的变量值

    执行结果:有volatile修饰的可以跳出循环,执行结束;

                      无volatile修饰变量,线程不会重新读取变量,无限循环。

    有不同见解,请多交流。。。

    转载请注明原文地址: https://ju.6miu.com/read-24225.html

    最新回复(0)