CAS实现无锁模式
用多线程实现一个数字的自增长到1000000,分别用无锁模式和锁模式来实现代码.
1.使用ReentrantLock.
package test; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.ReentrantLock; public class ThreadWithLock { private static final int THREAD_COUNT=3;
private static volatile int value= 0;
private static final ReentrantLock lock = new ReentrantLock();
private static final CountDownLatch startSignal = new CountDownLatch(1);
private static final CountDownLatch endSignal = new CountDownLatch(1); public static void main(String[] args) throws InterruptedException{ for(int i=0;i<=THREAD_COUNT;i++){
(new Counter()).start();
}
//start to record time.
long start = System.nanoTime();
//send the started signal to all threads.
startSignal.countDown();
//wait for anyone to finish the counting.
endSignal.await();
long end = System.nanoTime();
System.out.println(end-start);
} static class Counter extends Thread { @Override
public void run() {
try {
startSignal.await();
while(true){
try {
lock.lock();
if(value<1000000){
value++;
}
else {
break;
}
}
finally{
lock.unlock();
}
}
endSignal.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
}
使用CAS模式,这其实是一种乐观锁模式,它默认是没有竞争的,如果存在竞争,失败了让代码重试.
package test; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger; public class ThreadNoLock { private static final int THREAD_COUNT=3;
private static final AtomicInteger value= new AtomicInteger(0);
private static final CountDownLatch startSignal = new CountDownLatch(1);
private static final CountDownLatch endSignal = new CountDownLatch(1); public static void main(String[] args) throws InterruptedException{
for(int i=0;i<THREAD_COUNT;i++){
(new Counter()).start();
}
//start to record time.
long start = System.nanoTime();
//send the started signal to all threads.
startSignal.countDown();
//wait for anyone to finish the counting.
endSignal.await();
long end = System.nanoTime();
System.out.println(end-start);
} static class Counter extends Thread { @Override
public void run() {
try {
startSignal.await();
int current;
while(true){
if((current = value.get()) <1000000){
value.compareAndSet(current, current+1);
}
else{
break;
}
}
endSignal.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
}
把Thread_count分别设置为1000,300,30,3 得到的性能数据如下,我们可以发现无锁模式的效率更高.

CAS实现无锁模式的更多相关文章
- 无锁模式的Vector
这两天学习无锁的并发模式,发现相比于传统的 同步加锁相比,有两点好处1.无锁 模式 相比于 传统的 同步加锁 提高了性能 2.无锁模式 是天然的死锁免疫 下来介绍无锁的Vector--- LockF ...
- 使用CAS实现无锁的SkipList
无锁 并发环境下最常用的同步手段是互斥锁和读写锁,例如pthread_mutex和pthread_readwrite_lock,常用的范式为: void ConcurrencyOperation() ...
- CAS无锁模式
一.java内存模型:JMM 在内存模型当中定义一个主内存,所有声明的实例变量都存在于主内存当中,主内存的数据会共享给所有线程,每一个线程有一个块工作内存,工作内存当中主内存数据的副本当更新数据时,会 ...
- 使用CAS实现无锁列队-链表
#include <stdlib.h> #include <stdio.h> #include <pthread.h> #include <iostream& ...
- 基于CAS实现无锁结构
杨乾成 2017310500302 一.题目要求 基于CAS(Compare and Swap)实现一个无锁结构,可考虑queue,stack,hashmap,freelist等. 能够支持多个线程同 ...
- CAS 与 无锁队列
http://coolshell.cn/articles/8239.html http://www.tuicool.com/articles/VZ3IBv http://blog.csdn.net/r ...
- CAS无锁机制原理
原子类 java.util.concurrent.atomic包:原子类的小工具包,支持在单个变量上解除锁的线程安全编程 原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读 ...
- 锁、CAS操作和无锁队列的实现
https://blog.csdn.net/yishizuofei/article/details/78353722 锁的机制 锁和人很像,有的人乐观,总会想到好的一方面,所以只要越努力,就会越幸运: ...
- CAS原子操作实现无锁及性能分析
CAS原子操作实现无锁及性能分析 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 ...
随机推荐
- The Storage Situation: Removable Storage
http://commonsware.com/blog/2014/04/09/storage-situation-removable-storage.html There is a lot of co ...
- HTML5 video 视频标签全属性详解
现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera.Mozilla.Chrome),支持H.264的(Safari.IE ...
- 通过Sysprep封装系统
<?xml version="1.0" encoding="utf-8"?> <unattend xmlns="urn:schema ...
- java类的继承
继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(重写)的方式,产生一个新的类型.继承是面向对 象的三个基本特征--封装.继承.多态的其中之一,我们在使用java时编写的每一个类都是 ...
- JQUERY 一些技巧在实际中的应用
在jquery选择器中.继续做判断$("tr[rel!=" + id + "]").find('.status').html('--'); $("tr ...
- 自定义UserProvider,更改验证方法
新建UserProvider,如果继承EloquentUserProvider,注入model是必须的,或者去继承interface,自己实现一些方法 use Illuminate\Auth\Eloq ...
- Machine Learning in Action – PCA和SVD
降维技术, 首先举的例子觉得很好,因为不知不觉中天天都在做着降维的工作 对于显示器显示一个图片是通过像素点0,1,比如对于分辨率1024×768的显示器,就需要1024×768个像素点的0,1来表示, ...
- delphi 创建DBASE和FOXPRO两类DBF数据文件的差异
delphi 创建DBASE和FOXPRO两类DBF数据文件的差异,主要有几点: 1.创建方法不同 DBASE的创建方法: Self.Table1.Close; Self.Table1.Active ...
- nginx配置相关
一.autoindex on; 能解决无端端的403问题. 二.NGINX配置超时时间 1.啥时候用到 用来设置请求资源和服务器返回的时间,保证一个请求占用固定时间,超出后报504超时!这样可以保证一 ...
- HTML5的新事件
HTML 元素可拥有事件属性,这些属性在浏览器中触发行为,比如当用户单击一个 HTML 元素时启动一段 JavaScript. HTML 元素可拥有事件属性,这些属性在浏览器中触发行为,比如当用户单击 ...