赞
踩
线程安全的本质是共享变量
账户类:
1、创建一个账户对象
2、创建两个线程,分别代表小明 小红,去同一个账户中取钱
3、问题出现
线程同步常见方案:
加锁的方法有三种:如下所示
作用:把访问共享资源的核心代码给上锁,以此保证线程安全
原理:每次只允许一个线程加锁后进入,执行完毕后自动解锁,其他线程才可以进来执行
注意事项:
对于当前同步执行的线程来说,同步锁必须是同一把(同一个对象),否则会出bug
使用this代表线程共享资源,这样不会干扰别人
多个线程调用静态方法,使用类名.class
1、锁对象随便选择一个唯一的对象好不好呢?
不好,会影响其他无关线程的执行
作用:把访问共享资源的核心方法给上锁,以此保证线程安全
采用synchronized关键字对方法进行修饰,称之为同步方法
原理:每次只能一个线程进入,执行完毕以后自动解锁,其他线程才可以进来执行
自己创建锁对象,自己进行加锁和解锁
Lock锁是JDK5开始提供的一个新的锁定操作,通过它可以创建出锁对象进行加锁和解锁,更灵活、更方便、更强大
Lock是接口,不能直接实例化,可以采用它的实现类ReentrantLock来构建锁对象
每一个账户对象都应该有一个锁对象
如果代码执行中间出现问题,也应该进行解锁操作,更加安全,确保最终可以解锁,否则会出问题
当多个线程共同操作共享资源时,线程间通过某种方式互相告知自己的状态,以互相协调,并避免无效的资源争夺
1、先new一个桌子对象
2、创建3个生产者线程
3、创建2个消费者线程
4、放包子,不断地抢桌子
5、取包子
由于锁是可以跨方法的,因此使用方法锁,会锁住五个线程:(用同一个桌子对象作为锁)
注意:
上述方法应该使用当前同步锁对象进行调用
桌子上最多只能有一个包子
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。