码迷,mamicode.com
首页 > 编程语言 > 详细

线程共享数据的安全问题

时间:2018-08-28 00:58:32      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:线程共享数据   现在   来讲   bsp   str   例子   监视器   导致   自己   


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

方式一:同步代码块

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

  synchronized(任意对象){

    线程要操作的共享数据

  }

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

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

举个例子:

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

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

 技术分享图片

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

方法二:同步方法

  1.非静态方法

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

  好处:代码简洁

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

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

 

技术分享图片

 

  2.静态方法

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

技术分享图片

 

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

 

线程共享数据的安全问题

标签:线程共享数据   现在   来讲   bsp   str   例子   监视器   导致   自己   

原文地址:https://www.cnblogs.com/chenwei-blog/p/9545396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!