近两天学习线程浅得

本文探讨了Java虚拟机(JVM)的内存模型,并详细解释了可见性和有序性概念。作者通过类比版本控制系统SVN,形象地说明了线程间如何通过共享变量进行通信,以及如何利用synchronized和volatile关键字确保线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[color=black][size=medium]最近两天小学习了下jameswxx大大写的线程安全,觉得很有收获。现在总结一下。
首先,我了解了jvm的内存模型。jmm规定了jvm有主存,主存是被所有线程所共享的。而这当中涉及到了两个问题:可见性和有序性。
(1)可见性:所谓可见性就是一个线程对主存内容的做了修改,那么其他线程是可以看到的。jvm(不知道别的虚拟机上是不是这样)上多个线程之间是不能直接进行通讯的,只有通过共享主存中的变量才能进行沟通。
而线程修改主存内容方式是这样的:线程是不能直接修改主存当中的变量的;线程如果要修改变量则需要先从主存中讲变量复制到自己的工作内存中;在工作内存中修改变量;修改完成后将变量重新写回到主存。
像这样,一个线程修改了这个变量,然后其他线程可以看见这个修改后的值,叫做可见性。
(2)有序性:所谓有序性就是线程对变量的加载,使用和刷新的顺序是由jvm控制的。同一个线程对变量再次修改时可能继续加载变量主存的值也可能直接使用在工作内存中的值,等操作完后再刷新到缓存。[/size][/color]
由于这两个问题,多个线程共享一个变量时就出现问题了(没有例子,因为懒),而这时就涉及到了线程的安全即多个线程对于变量的有序修改或访问。
我突然觉得线程安全很像我们所使用的版本控制软件,比如说svn。我们项目像是变量,svn服务器则是主存而我们每个程序员就像是一个个线程。写代码的过程则相当于对变量的一次修改或访问。当多人都修改同一段代码时,在没有锁定的情况下,提交修改的代码会造成版本冲突,这就相当于线程不安全。而锁定则相当于synchronized。
而保证同步的关键字除了synchronized外还有volatile。两者的区别是,synchronized既保证了可见性又保证了有序性,这是因为synchronized为会冲突的变量表示了一个临界区,线程在临界区的运行方法是:1、获得同步锁;2、清空工作内存;3、read;4、修改变量;5、load;6、释放锁。这就保证了可见性和有序性。而volatile只保证了可见性,因为被volatile修饰的变量不会被read到工作内存,变量一经修改就会被写回主存,所以所有的进程都能及时看到。(未完待续)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值