volatile如何保证可见性(为什么voliter修饰能够实现线程安全,请简述)

本文目录
为什么voliter修饰能够实现线程安全,请简述
volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
这句话可以理解出两点:
加了volatile之后编译器不会对其进行优化。因为你的一句话,并不是一条指令,会被编译成多条计算机指令,一般计算机会对其进行优化和重新排序,这就不能保证还是原来的执行顺序也就不能保证执行结果是安全的,加了volatile之后编译器不会对其优化重排序。
可见性。每个线程都保存有公共变量的副本,变量赋值也不是你想象中的立刻就能被其他线程看到,因为其他线程的副本可能没有更新。加了volatile之后,当其他线程要读取该变量时,会强制从主内存中读取并刷新副本,保证更新后的值一定能被其他线程读取到。
最后、volatile只能保证可见性,保证读取是线程安全的,并不能保证写入的安全性。适用于单线程写,多线程读。
请教一个java多线程的可见问题
第一:你那个thread未必能在while循环判断条件之前执行,不是写在前面就一定能在前面先执行
第二:volatile可以保证可见性,不加也并代表一定没有可见性,运行中很多种情况会导致线程去主存来刷新工作内存中的变量内容。举个例子就是并发下的 int i++操作,不加volatile一样可以累计只是累计值差一点,说明别的线程是可以看到其他线程修改后的值的。不然每个人看到都是0,然后写会内存永远都是1。
一般来讲,如果不是那种计算密集型任务,例如空循环这种,A线程在空循环时很难读到别的线程变量改变后的值。你可以理解为线程A太忙了以至于没空刷新自己的工作内存的变量值,一旦有空就会去刷新。所以如果你想中断一个线程的循环,一般都是用whil(flag){},flag设置为volatile变量,保证可见性,否则flag改变后,另一个线程未必能立刻读的到改变从而立刻响应停止。
线程间通信有哪些方式
线程间通信方式有:
1、volatile
volatile有两大特性,一是可见性,二是有序性,禁止指令重排序,其中可见性就是可以让线程之间进行通信。volatile语义保证线程可见性有两个原则保证:
(1)所有volatile修饰的变量一旦被某个线程更改,必须立即刷新到主内存。
(2)所有volatile修饰的变量在使用之前必须重新读取主内存的值。
2、等待/通知机制
等待通知机制是基于wait和notify方法来实现的,在一个线程内调用该线程锁对象的wait方法,线程将进入等待队列进行等待直到被通知或者被唤醒。
3、join方式
join其实合理理解成是线程合并,当在一个线程调用另一个线程的join方法时,当前线程阻塞等待被调用join方法的线程执行完毕才能继续执行,所以join的好处能够保证线程的执行顺序。
但是如果调用线程的join方法其实已经失去了并行的意义,虽然存在多个线程,但是本质上还是串行的,最后join的实现其实是基于等待通知机制的。
4、threadLocal
threadLocal方式的线程通信,不像以上三种方式是多个线程之间的通信,它更像是一个线程内部的通信,将当前线程和一个map绑定,在当前线程内可以任意存取数据,减省了方法调用间参数的传递。
线程特点:
1、轻型实体
线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。线程的实体包括程序、数据和TCB。线程是动态概念,它的动态特性由线程控制块TCB(Thread Control Block)描述。
2、独立调度和分派的基本单位
在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)。
3、可并发执行
在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。
4、共享进程资源
在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址。
此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。

更多文章:
turtles歌曲(哪位大神有turtles(乌龟组合)的<谢谢>的歌词中文翻译 感激不尽)
2026年10月11日 10:00
金山铁路22号线(请问现在轨道交通22号线金山铁路是个什么情况据说9月28日就开通了啊~~~)
2026年10月11日 09:10
repercussions(都是余波,repercussions和aftermath有什么区别啊)
2026年10月11日 09:00
dropdownlist 绑定(DropDownList 绑定所有项 并 显示指定项)
2026年10月11日 08:50
易语言网页api接口怎么调用(易语言,怎么读取网页json的api)
2026年10月11日 08:00
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40



