在多线程的调度下,导致出现了一些随机性,随机性使代码中出现的另一些bug 这就是线程不安全
造成线程不安全的原因
1.抢占式执行,调度过程随机.(最基本的原因)
2.多个线程随时修改同一个变量.
3.针对变量的操作,不是原子的. 例如count++这种,本质上是三个指令,load,add,save.
4.内存可见性问题, 一个线程读,一个线程写
加锁的方式有三个
1.对普通方法进行加锁
class A {
int i;
synchronized public void add() {//表示将这个方法加锁,这一个方法是一个原子性的操作. 如果对一个普通方法加锁就相当于把锁对象指定为this了
i++;
}
}
2.对一段代码块进行加锁
class B {
int i;
public void add() {
synchronized (this) { //如果要对一个代码块加锁,就需要手动指定,锁对象是啥.(针对哪儿个对象加锁)
i++;
}
}
}
3.对一个静态方法进行加锁
class C {
int i;
public void add() {
synchronized (C.class) { //这个表示针对当前对象进行加锁,加锁的本质是 将当前类的隐藏属性 改为加锁状态
i++;
}
}
}
可重入锁