1.概述
编写线程安全的代码其核心点在于对于状态访问操作进行管理,特别是对于共享的、可变的状态的访问
2.线程安全性
当多个线程访问一个类时,不管运行环境采用何种调度方式或者多个线程之间以何种时许来进行交替执行,并且在主调代码中不需要采用任何协同和同步机制,这个类都能表现出正确的行为,那么这个类就行线程安全的
无状态的类一定是线程安全的
3.竟态条件
当某个计算的正确性取决于多个线程交替执行的时许时,那么就会发生竟态条件
对于一个或者一组变量的操作(读和写)必须保证原子性才能有效的避免竟态条件
4.Java内置锁-synchronized
- synchronized保证了被锁住部分执行时的原子性
- synchronized锁是以锁住的对象为一个锁粒度,即JVM在识别锁时是以锁住的对象为维度类确认是否是同一把锁
- synchronized是可重入的,重入的粒度为
线程
,而不是调用
- 内置锁的可重入保证了子类中同步方法引用父类的同步方法时,可以有效的获取锁,且不会发生死锁的情况。此时获取到的锁锁住的是子类对象
- 当获取与对象关联的锁时,线程在获取对象的锁后,只能阻止其他线程获取锁,并不能阻止其他线程访问此对象
5.活跃性与性能
安全性一定是第一位的,在保证线程安全的前提下,可以将锁的粒度尽量细化,以提高程序性能(当然这并不是绝对的,比如一种情况,在大量的for循环中,一定要在for循环外面获取锁,而不是每次循环中获取锁,这种称之为锁膨胀)
当执行时间较长的计算或者无法快速完成的操作时(如王磊I/O或者控制台I/O),一定不要持有锁
网友评论