线程锁原理

线程锁确保了在同步块内的变量更新对所有线程可见,通过使高速缓存无效和刷新改动到主内存来实现。多线程环境下,数据同步是必要的,因为线程可能在不同缓存中持有变量副本,指令执行顺序也可能因优化而改变。对于单核CPU,单指令的多线程操作能避免一些同步问题。
摘要由CSDN通过智能技术生成

线程锁的原理:当对象获取锁时,它首先使自己的高速缓存无效,这样就可以保证直接从主内存中装入变量。

同样,在对象释放锁之前,它会刷新其高速缓存,强制使已做的任何更改都出现在主内存中。这样,会保证在同一个锁上同步的两个线程看到在synchronized 块内修改的变量的相同值。

一般来说,线程以某种不必让其他线程立即可以看到的方式(不管这些线程在寄存器中、在处理器特定的缓存中,还是通过指令重排或者其他编译器优化),不受缓存变量值的约束。

不管是Java还是C,都会遇到多线程数据同步的问题。一种解决数据因为多线程访问导致出错的方案就是使用锁。

通过Java的字节码或者C程序的汇编指令看,我们编写的语句,都是由多个机器指令完成的,所以会出现多个线程在CPU执行指令顺序无法预测,从而导致对数据处理结果会出错。

那如果涉及多线程数据同步的语句都是单指令的,是否可以保证不出问题呢?对于单核CPU是可以保证的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李小白20200202

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值