线程安全
- 一.线程安全存在的问题
- 二.锁
- 三.关于锁的理解
- 四.关于锁操作混淆的理解
- 4.1两个线程是否对同一对象加锁
一.线程安全存在的问题
为什么这里的count不是一百万呢?这就是线程所存在的不安全的问题,由于线程是抢占式执行,同时执行count++,操作本质是三个指令
1.load 读取内存上的值到寄存器中
2.add 寄存器上的值+1
3.save 将寄存器上的值放回到内存中
线程不安全的原因小结:
1.根本原因:线程的随机调度,抢占式执行
2.代码中多个线程,同时修改一个变量
3.多线程修改操作,本身不是"原子的".
4.内存可见性问题
5.指令重排序问题
我们可以通过加锁操作来解决线程不安全的问题
二.锁
t1执行lock的时候,就对t1这个线程加锁成功,而t2后执行lock的时候,由于已经加上锁,所以它会进入长时间的阻塞状态,一直阻塞到t1线程unlock之后,才能获取到锁.
三.关于锁的理解
(1) 一个线程加锁,一个线程不加锁,是不是会出现线程安全问题?
答案当然是会出现线程安全问题,因为一个加锁,一个不加锁,不会出现锁竞争,就会出现线程安全问题
(2) 两个线程对不同的对象加锁,会不会出现线程安全问题?
当然也会出现线程安全问题.锁竞争不会出现.
四.关于锁操作混淆的理解
4.1两个线程是否对同一对象加锁
类名.class意思就是类对象,它可以得知类中的属性,名字,参数,访问权限修饰符,继承自哪个类,实现了什么接口.
锁里面传参数是this 就可以等价位 在方法的前面写锁
锁里面传参数是类对象,就相当于锁加上一个静态方法