前言:
此刻咱们对“java无锁”大约比较着重,你们都想要了解一些“java无锁”的相关内容。那么小编同时在网上汇集了一些关于“java无锁””的相关知识,希望大家能喜欢,咱们快快来了解一下吧!一、简介
众所周知并发的典型代表是synchronized关键字的使用。它通过对共享资源上锁来保证线程安全。更确切的说synchronized是悲观锁。而java还提供了一种无锁并发机制来保证线程的安全,这就是著名的CAS(Compare And Swap 即比较和交换)。CAS并不是一个具体的类,它是一种技术:不通过使用线程锁而达到对于共享资源的安全访问。它也是乐观锁的一种形式。
二、技术算法描述
CAS中有三个操作数 —— 要变更的变量(V)、预期原值(E)和新值(N)。如果V的值和预期原值E相等,则将V的值设置为新值N。否则说明已经有其他线程做了更改,当前线程则不进行更新操作,或者可以重新读取该变量的值再次尝试修改。
当多个线程同时使用CAS操作一个变量时,只有一个会成功更新。这就保证了共享资源的线程安全。另外由于没有使用锁,因此也就不可能发生死锁。操作流程图:
对于CPU来讲不论CAS操作过程有多复杂,步骤有多少,都作为一条指令来执行,因此不可能出现中断和让出。这从计算机的底层就保证了CAS的正确性。
三、CAS在java中的具体体现类
java中的CAS操作主要使用了sun.misc.Unsafe类。有兴趣的朋友可以看一看这个类的源码。类中的方法都是直接使用操作系统底层资源执行任务,里面提供了大量操作内存的方法。而对于CAS的操作体现在compareAndSwapObject(对于引用对象的CAS操作)、compareAndSwapInt(对于int类型的CAS操作)、compareAndSwapLong(对于long类型的CAS操作)三个方法上。
java并发包中的原子操作类AtomicBoolean、AtomicInteger等底层也是使用Unsafe来实现的。
觉得有帮助请关注我,持续分享java生态。
标签: #java无锁 #java无锁化编程是哪种方法