1. 为什么会发生线程安全问题
当多个线程在共享同一个全局变量或静态变量,并对这个变量同时写入的时候,可能会发什么数据冲突问题,这就是线程安全问题。
2. 解决方式
可以使用线程之间同步 synchronized 或 lock 锁来解决这个问题。导致这个问题是因为多个线程共享同一个变量时,在某代码块中会可能存在都在写入的操作。那么synchronized 和lock 原理都是只允许一个线程进入到这个代码块,操作完后释放,然后再让下一个线程进入。
3. 内置锁:synchronized
内置锁也称为互斥锁:即线程A获取到锁后,线程B阻塞,直到线程A释放掉锁,线程B才能获取到这个锁。
同步方法
在方法上修饰 synchronized称为同步方法。
就是将可能会发生线程安全问题的代码,给包括起来。
synchronized void sale(){
.....
}
如果
- synchronized 修饰的是普通方法,那么使用的是 this 锁
- synchronized 修饰的是静态方法,那么使用的是当前类的字节码作为锁
同步代码块
在synchronized下包裹的代码称为同步代码块
就是将可能会发生线程安全问题的代码,给包括起来。
synchronized(同一个数据){
可能会发生线程冲突问题的代码
}
没有锁的线程,即使获取到 CPU的执行权,也无法进行到同步代码块中
4 多线程死锁
同步中嵌套同步,导致锁无法被释放。
网友评论