如何保证线程的安全?(synchronized)

synchronized 关键字

  上篇中我们提到了多线程中可能存在线程不安全的情况发生,那么针对此问题我们应该怎么去解决呢,如下图,如果按照这样的顺序执行线程,必定会造成数据的丢失,也就产生了线程安全问题.
在这里插入图片描述

   下面介绍一种解决线程安全问题的解决方法,那就是:加锁!!!
synchronized 关键字(监视器锁) 他的功能就是,保证了操作的原子性,同时,禁止了指令的重排序和保证了内存的可见性。
synchronized的底层是使用操作系统的mutex lock实现的。

在这里插入图片描述
  在要执行的操作加上synchronized关键字后,再次执行线程不安全的操作,发现问题已经得到了解决,
这是由于加锁机制,是程序在执行到该处时才执行加锁,执行完成后在进行解锁,
使用了synchronized关键字就相当于给操作新增了两个指令,lock和unlock,
lock具有的特性:
1.只有一个线程能够执行成功,其他的线程会进入阻塞等待状态。
2.如果第一个线程已经执行成功,第二个线程也尝试lock就会进入阻塞等待,直到第一个线程执行unlock释放锁。
在这里插入图片描述
  lock和unlock的例子在我们生活中也有类似的场景,
  比如多个人在ATM机上取钱时,第一个人进去后,将ATM机房锁住,其他的人只能在外边等待,这些等待的人就会被视为“阻塞等待”的状态。进入取钱的人执行lock操作,出来之后执行unlock操作,当机房处于lock状态时,其他人不能进入ATM机房。

volatile 关键字

  此外,volatile 关键字可以禁止编译器进行“内存可见性”和“指令重排序”的优化,
(编译器看到这个关键字后就不敢轻举妄动了!!)
  但是呢,好的东西往往要付出代价,synchronized所带来的负面作用就是程序的运行效率降低了,一方面因为他把优化关闭了,而另一方面synchronized他导致了线程之间存在了等待的过程,所以导致可能程序的执行效率降低。
一般情况下,只要程序中加锁了,必定会影响到程序的执行效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值