线程安全:保证数据的高度一致性和准确性。 当我们并发编程下怎么才能保证线程安全呢?是不是一定加锁才能线程安全呢? 个人理解:不是,只要你感觉代码里面没有变量互串,线程之间不会相互打扰;比如6个人干6件不同的事和6个人干一件相同的事,是不是就不一样?6个人做6件事肯定是安全的,当然1个人做6件事也是安全的。
想实现线程安全大致总结了3种方法:
- 多实例,也就是不用单例模式
- 使用java.util.concurrent下面的类库
- 使用锁机制synchronized,Lock方式
锁的介绍:
1.线程同步synchronized,又称为隐式锁
synchronized可以修饰地方有两个,一个是在方法中声明时使用,放在范围操作符(public等)之后;二是修饰代码块上面,这里不详解。
注意事项:在不同位置修饰的对象会不同
2.显示锁Lock和ReentrantLock 要手动释放
3.显示锁ReadWriteLock和ReentrantReadWriteLock
ReadWriteLock接口提供ReadLock和writeLock两种锁操作机制,适用于一个共享资源被大量读取操作,而只有少量的写操作,写入时线程必须是互斥访问。 ReentrantReadWriteLock是非公平锁(可以插队),读写锁中写线程获取写入锁后可以再次获取读取锁,但读取锁获取读取锁后却不能获取写入锁。即读-读不互斥;读-写互斥;写-写互斥,相信这也好理解。 注意事项:从代码上实现可知,读的时候是并发的,写的时候是有顺序的带阻塞机制的。
ReentrantReadWriteLock和ReentrangLock
二者比较:相同点:其实都是一种显示锁,手动加和解锁,很适合高并发场景。
不同点:ReentrantReadWriteLock是对ReentrangLock的复杂扩展,能适合更加复杂的业务场景,ReentrantReadWriteLock可以实现一个方法的中的读写分离的锁的机制。而ReentrangLock加锁解锁只有一种机制。