标签:线程共享数据 现在 来讲 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