线程的安全性

出现安全性问题的原因:对共享的可变的状态访问

如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么就会出现错误,有三种方式修复这个问题:

a、不在线程之间共享该状态变量;

b、将状态变量修改为不可变的变量;

c、在访问状态变量的时候使用同步;

1、线程安全性(核心正确性)
当多个线程访问某个类时,这个类始终都能够表现出正确的行为,那么就称之为这个类是线程安全的。
注释:无状态的对象一定是线程安全的

2、操作的原子性---不可分割的单元
在并发编程中,由于不恰当的执行时序而出现不正确的结果是一种重要的情况,叫做竞态条件
竞态条件的本质是基于一种可能失效的观察结果来做出判断或者执行某个计算。

内置锁或者监视锁(同步代码块synchronized)
synchronized(lock) {
。。。。
}
同步代码块包括两部分:一个作为锁的对象引用,一个作为由这个锁保护的代码块

锁的重入性:如果某个线程试图获得一个由它自己持有的锁,如果这个请求成功,那么这个锁具有重入性(内置锁具有重入性);
重入的一种实现方式:为每个锁关联一个获取计数值和一个所有者线程。当计数值为0时表示锁没有被任何线程持有。当线程请求一个未被持有的锁时,jvm记下锁的持有者并将获取计数值制为1.如果同一个线程再次获取这个锁,计数值递增,而当线程退出同步代码块时,计数器递减。当计数值减为0时,这个锁将被释放。
锁的重入性可以解决当子类改写父类的synchronized方法,然后调用父类中的方法造成的死锁问题

注释:一般情况下,当一个线程请求一个正在被其他线程持有的锁时,发出请求的线程就会被阻塞。

3、使用锁来保护状态  

4、活跃性与性能

猜你喜欢

转载自blog.csdn.net/l1394049664/article/details/81294141