Java锁机制
涉及到多线程必然涉及到对公共资源的操作(增删改查),也会涉及到私有资源与共有资源不一致的情况。为了解决这些问题,提出了加锁的方案,这个方案的总体思想是:时间换空间。所以必然造成效率的下降,无论在系统开发中还是现实生活中,这些问题和这种加锁的方案都是存在的。本文主要针对的是java系统开发中所面临的锁机制。
1.Synchronized(可重入锁、独享锁、悲观锁)
java6 之后对其进行了升级,试其性能有所提高。注意和wait(),notify()的配合使用。
2.ReentrantLock(可重入锁、独享锁、悲观锁)
是对Synchronized的升级,注意和Condition的配合使用来实现wait(),notify()的功能。
3.ReadWriteLock(读写锁、共享锁、悲观锁)
4.StampedLock(读写锁、共享锁、乐观锁)
java8的新特性
5.Concurrent集合(线程安全)
当多个线程访问Concurrent集合的时候,通过java的锁机制,阻塞、唤醒实现的线程安全。不用自己去写了,直接调用就可以。
备注:java的原子操作(不可分割)不用加锁,比如:
1.在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,除了long,double,因为他们是64位的。
int i = 0; //这是原子操作
2.对象地址的赋值也是原子操作。
List a = new ArrayList()<>;
List list = a; // 这一行是原子操作
3.使用Atomic达到原子操作的目的
其原理利用了CAS(CompareAndSet)来实现原子操作的,cas是通过数据对比来实现数据的正确性的。