文章目录
什么是线程安全?线程为什么存在安全问题?
当我们需要多个线程之间,“共享某资源”。即:同一个全局变量/静态变量。当多个线程在对这个变量进行写操作时可能会发生冲突问题,即线程的安全问题。但是做读操作是不会发生数据冲突问题。
如何解决线程不安全的问题?
- 使用同步锁,即:synchronized关键字修饰(代码块/函数)
- 使用Lock锁
为什么使用了锁,线程就安全了?
使用锁后,某一段代码只能让一个线程进入执行。代码执行完毕之后才释放锁,释放之后其他线程才能有资格进入执行。
举个栗子: 一个洗手间只能一个人进入,进入之后反锁。其他的人只能里面的人使用完了,把门锁开了才能进去。
什么是线程之间的同步?
即:多个线程之间共享一个资源,不会受到其他线程的干扰。
什么是同步代码块/函数?
// 同步代码块
synchronized(共享的数据){
// 当多线程情况下会出现问题的代码
}
// 同步函数
public synchronized void xxx(){
// 当多线程情况下会出现问题的代码
}
线程之间的死锁是什么一回事?
即:多线程死锁问题,死锁的产生条件如下:
- 互斥条件:一个资源每次只能被一个线程使用
- 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放
- 不剥夺条件:进程已经获得的资源,在未使用完之前,不能强行剥夺
- 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系
如何避免死锁?
- 加锁的顺序
- 加锁的时限
- 死锁检测
关于死锁和避免死锁的更多内容可以百度进行深入学习
synchronized 的缺点
无法显示的手动上锁和解锁
(想要控制锁,就需要使用JDK中的并发包(JUC包)中的锁lock)