线程共享数据的安全问题


加同步代码:加了同步代码后,线程进同步判断锁,获取锁,出同步释放锁,保证了线程安全,但导致了线程运行速度的下降

方式一:同步代码块

  解决线程安全问题,java程序提供了线程同步技术

  synchronized(任意对象){

    线程要操作的共享数据

  }

任意对象:通俗来讲叫同步锁或者对象监视器

同步的作用:保证线程的安全性,没有锁的线程是不能执行的,只能等待带锁的线程执行完拿到同步锁才能进入同步代码块中执行。

举个例子:

  现在有3个线程需要进入代码块中执行,当 线程1 遇到synchronized以后,线程1 会去判断同步锁还有没有,同步锁如果有,线程1把锁带走进入同步代码块中执行操作,执行完以后,线程1 离开同步代码块,就把锁还回去了(释放锁)。

  假如线程1进入同步代码块中的时候睡着了,此时 线程2 执行了,但是 线程2 在遇到 synchronized 时,去判断同步锁还在不在,此时的同步锁在线程1手上,线程2 拿不到同步锁,没有进入同步代码块的钥匙了,就不能进去同步中执行,被阻挡在同步代码块的外面,只有等 线程1 醒过来把同步锁还给 synchronized 了,此时 线程2 才有机会拿到钥匙(=锁)进入同步代码块中执行操作。

 

 ------------------------------------------------------------------------------------------- ---------------------------------------------

方法二:同步方法

  1.非静态方法

  采用同步方法形式,解决线程安全问题。

  好处:代码简洁

  用法:将线程共享数据,抽取到一个方法中,在方法的声明上加入同步关键字 synchronized 

   同步方法中的对象锁是本类的对象引用 this。

 

 

  2.静态方法

  静态方法也有同步锁,同步锁是本类自己.class

 

----------------------------------------------------------------------------------------------------------------

 

转载于:https://www.cnblogs.com/chenwei-blog/p/9545396.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值