目标:
1.理解线程安全?
2.synchronized用法
3.死锁
一、什么是线程安全问题?
当多个线程同时共享 ,同一个全局变量或静态变量,在做写的操作时,可能会发生数据冲突问题。
这就是线程安全问题,但是当做读的操作是不会发生数据冲突问题的。
例子:
比如抢火车票。
1号窗口,2号窗口,同时出售第一张火车票,这样就是现成安全问题?
结论:当多个线程同时共享同一个全局变量或者静态变量,在做写的操作时可能会发生数据冲突,造成线程安全问题。
那么如何解决线程安全问题呢?
答:使用多线程之间同步或使用锁(lock)。
什么是线程之间的同步呢?
既然能解决线程安全问题?多个线程共享同一个全局变量时可能发生数据冲突,那么是不是 同步就不能让他们发生数据冲突呢?也就是 当这个线程在使用这个全局变量的时候其他线程不能对这个全局变量进行操作,必须等他操作完成之后才能进行操作。
答:多个线程共享同一全局变量的时候,不会受到其他线程的干扰。
什么是锁?
答:锁顾名思义就是 给你这个东西上一个锁,其他人进不来。
代码演示:
①同步代码块
什么是同步代码块?
答:就是讲可能发生线程安全的代码,给包括起来。
synchronized(同一个数据){
可能会发生线程冲突问题
}
这里就不会出现 上面两个线程抢同一张票的情况!
②同步函数
什么是同步函数?
答:方法被synchronized 修饰的方法,叫同步方法,
同步我们都要定义一个锁对象,但是这个同步函数的锁对象是谁呢?
答:this
证明方式:一个用明锁,一个不用,看是否出现数据冲突问题。
③静态同步函数
什么是静态同步函数?
答:就是在同步函数前加一个 static 关键字,
那么静态同步函数又是用的什么对象锁呢?
注意这里静态方法都会被先加载。所以这里的锁对象是 该函数的字节码对象。
可以通过getClass 或者 类名.class
总结:
synchronized 修饰方法 是用的this 锁
synchronized 修饰静态方法 是用的 字节码对象。
二、多线程死锁
什么是死锁?
两个线程各抱着自己的锁,等着对方释放锁。这就是死锁。一直等下去。。。
什么原因造成的?
同步中嵌套同步!
面试题总结:
1.什么是线程安全问题?如何解决?
答:当多个线程共享同一个全局变量或静态变量,可能会造成数据冲突。使用同步或者锁。
2.如何判断会造成线程安全问题。
答:如果这个线程有写的操作,就可能会发生线程安全问题,如果是读的操作则不会发生线程安全问题
3.什么是死锁
答:同步中嵌套同步