线程同步
为什么要了解线程同步?
多个线程执行的不确定性引起执行结果的不稳定性
多个线程对账本的共享,会造成操作不完整性,会破坏数据
例如:两个人同时取银行卡的钱 需要保证事物的原子性
方式一:同步代码块
synchronized(同步监视器)
{
//需要被同步的代码
}
需要先解释两个概念
共享数据和同步监视器
共享数据:多个线程共同操作的变量,比如:ticket就是共享数据
同步监视器:锁,任何一个类的对象 都可以称为锁
要求:多个线程必须共用同一把锁
那么如何找到唯一的锁(即共享的对象)
那么就引申出继承Thread类和实现Runnable接口的区别
拿卖票举例
以下是Runnable接口的
继承Thread类的
由此可以得出 Runnable是多个线程共同完成一个任务
Thread是多个线程分别完成自己的任务
故此 我们在选择同步锁的时候 Runnable可以选this对象而继承Thread的不行
继而引出下一个问题,那么继承Thread的类有没有唯一对象可以用来当锁?答案是有的 可以用
MyThreadTickerSell.class (类名.class) 这个对象每次只会加载一次又或者我们可以自己创建一个静态对象来当锁 也是可以的
方式二:同步方法
如果操作共享数据的代码完整的声明在一个方法中,不妨将此方法声明同步
而继承Thread的不能直接加synchronized方法 得把该方法设置成静态方法