Java并发笔记--锁机制(二)

91 阅读2分钟

线程安全:保证数据的高度一致性和准确性。 当我们并发编程下怎么才能保证线程安全呢?是不是一定加锁才能线程安全呢? 个人理解:不是,只要你感觉代码里面没有变量互串,线程之间不会相互打扰;比如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加锁解锁只有一种机制。