在线客服
扫描二维码
下载博学谷APP
扫描二维码
关注博学谷微信公众号
同步代码块如何解决数据安全问题?同步中的线程,没有执行完毕不会释放锁,同步外的线程没有锁进不去;同步保证了只能有一个 线程在同步中执行共享数据,保证了安全;程序频繁的判断锁,获取锁,释放锁,程序的效率会降低。
一、同步代码块
synchronized关键字可以用于方法中的某个区块中,表示只对这个区块这个区块的资源实现互斥访问
卖票案例出现了线程安全问题
卖出了不存在的票和重复的票
解决线程安全问题的一种方案:使用同步代码块
格式:
synchronized(同步锁){
需要同步操作的代码
}
注意事项:
1.通过代码块中的锁对象,可以使用任意的对象
2.但是必须保证多个线程使用的锁对象是同一个
3.锁对象作用:把同步代码块锁住,只让一个线程在同步代码块中执行

测试类:

二、同步技术的原理
使用了一个锁对象,这个锁对象叫同步锁,也叫对象锁,也叫对象监视器
3个线程一起抢夺cpu的执行权,谁抢到了谁执行run方法进行卖票
t0抢到了cpu的执行权,执行run方法,遇到synchronized代码块
这时t0会检查synchronized代码块是否有锁对象
发现有,就会获取到锁对象,进入到同步中执行
t1抢到了cpu的执行权,执行run方法,遇到synchronized代码块
这时t1会检查synchronized代码块是否有锁对象
发现没有,t1就进入到阻塞状态,会一直等待t0线程归还锁对象
一直到t0线程执行完同步中的代码,会把锁对象归还给同步代码块
t1才能获取到锁对象进入到同步中执行
出现线程安全问题,会出现不存在的数据以及重复的数据,解决线程安全问题的其中一种方案使用同步代码块。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
Java基础 "=="和 equals 方法究竟有什么区别?
Java基础 "=="和 equals 方法究竟有什么区别?==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
9331
2019-05-23 11:31:26
Java开发中abstract class 和 interface 有什么区别?
含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象。含有 abstract 方法的类必须定义为 abstract class,abstract class 类中的方法不必是抽象的。abstract class 类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象态方法。
8219
2019-05-24 15:31:52
Java基础开发的集合类都有哪些?主要方法有什么?
你所知道的Java基础开发的集合类都有哪些?主要方法有什么?最常用的集合类是 List 和 Map。 List 的具体实现包括ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。
8125
2019-06-03 11:16:40
TLAB线程本地分配缓存区是什么?TLAB工作原理分析
TLAB线程本地分配缓存区是什么?工作原理分析,TLAB全称Thread Local Allocation Buffer,即线程本地分配缓存区,是一个线程专用的内存分配区域。在线程初始化时,虚拟机会为每个线程分配一块TLAB空间,只给当前线程使用。
9318
2020-03-17 15:26:25
Java基础面试题和答案整理
为了帮助大家可以更好地做好面试前的准备,本文为大家整理了Java基础面试题和答案。这些问题都是比较经典的面试题,大家可以先不看答案做一做,查漏补缺。
5490
2020-07-01 14:33:38
