JUC是java.util.concurrent包的缩写,见名知意concurrent中文译为同步执行的,意思就是并行,所以这个包中主要提供的就是并行处理的一些解决方案,并行处理的解决方案通常都是加锁,所以这个包下的的方法都是采用CAS方式进行加锁的。
所谓CAS就是通过java底层的Unsafe类直接对内存进行 *** 作,CAS由三个参数构成:
内存值V,旧的预期值A,要更新的值B。
当V=A时才会将B修改并且返回true。
以JDK1.8为例JUC下有两个子包atomic和locks,atmoic中主要定义了一些原子 *** 作的类,而locks中主要定义了基于AQS(AbstractQueuedSynchronzer)实现的加锁机制。
AQS是一个抽象类,其类中定义了一系列方法,而所有的方法都是通过对state变量进行原子从 *** 作来进行锁的实现,其内维护了一个双向链表用作获取锁的队列。
AQS定义两种资源共享方式:Exclusive(独占,只有一个线程能执行,如ReentrantLock)和Share(共享,多个线程可同时执行,如Semaphore/CountDownLatch)。
JUC包下还有其他关于原子 *** 作的类,以ConcurrentHashMap为例,当对其进行put时,如果未发生hash冲突都是采用CAS方式实现线程安全的,如果发生冲突需要采用synchronized进行加锁处理。
理解之上,写出想要说的话!
以上仅为个人拙见,写出来加深记忆,错误之处欢迎大神指正!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)