用多线程实现一个数字的自增长到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实现无锁模式的更多相关文章

  1. 无锁模式的Vector

    这两天学习无锁的并发模式,发现相比于传统的 同步加锁相比,有两点好处1.无锁 模式 相比于 传统的 同步加锁  提高了性能 2.无锁模式 是天然的死锁免疫 下来介绍无锁的Vector--- LockF ...

  2. 使用CAS实现无锁的SkipList

    无锁 并发环境下最常用的同步手段是互斥锁和读写锁,例如pthread_mutex和pthread_readwrite_lock,常用的范式为: void ConcurrencyOperation() ...

  3. CAS无锁模式

    一.java内存模型:JMM 在内存模型当中定义一个主内存,所有声明的实例变量都存在于主内存当中,主内存的数据会共享给所有线程,每一个线程有一个块工作内存,工作内存当中主内存数据的副本当更新数据时,会 ...

  4. 使用CAS实现无锁列队-链表

    #include <stdlib.h> #include <stdio.h> #include <pthread.h> #include <iostream& ...

  5. 基于CAS实现无锁结构

    杨乾成 2017310500302 一.题目要求 基于CAS(Compare and Swap)实现一个无锁结构,可考虑queue,stack,hashmap,freelist等. 能够支持多个线程同 ...

  6. CAS 与 无锁队列

    http://coolshell.cn/articles/8239.html http://www.tuicool.com/articles/VZ3IBv http://blog.csdn.net/r ...

  7. CAS无锁机制原理

    原子类 java.util.concurrent.atomic包:原子类的小工具包,支持在单个变量上解除锁的线程安全编程 原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读 ...

  8. 锁、CAS操作和无锁队列的实现

    https://blog.csdn.net/yishizuofei/article/details/78353722 锁的机制 锁和人很像,有的人乐观,总会想到好的一方面,所以只要越努力,就会越幸运: ...

  9. CAS原子操作实现无锁及性能分析

    CAS原子操作实现无锁及性能分析 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 ...

随机推荐

  1. The Storage Situation: Removable Storage

    http://commonsware.com/blog/2014/04/09/storage-situation-removable-storage.html There is a lot of co ...

  2. HTML5 video 视频标签全属性详解

    现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera.Mozilla.Chrome),支持H.264的(Safari.IE ...

  3. 通过Sysprep封装系统

    <?xml version="1.0" encoding="utf-8"?> <unattend xmlns="urn:schema ...

  4. java类的继承

    继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(重写)的方式,产生一个新的类型.继承是面向对 象的三个基本特征--封装.继承.多态的其中之一,我们在使用java时编写的每一个类都是 ...

  5. JQUERY 一些技巧在实际中的应用

    在jquery选择器中.继续做判断$("tr[rel!=" + id + "]").find('.status').html('--'); $("tr ...

  6. 自定义UserProvider,更改验证方法

    新建UserProvider,如果继承EloquentUserProvider,注入model是必须的,或者去继承interface,自己实现一些方法 use Illuminate\Auth\Eloq ...

  7. Machine Learning in Action – PCA和SVD

    降维技术, 首先举的例子觉得很好,因为不知不觉中天天都在做着降维的工作 对于显示器显示一个图片是通过像素点0,1,比如对于分辨率1024×768的显示器,就需要1024×768个像素点的0,1来表示, ...

  8. delphi 创建DBASE和FOXPRO两类DBF数据文件的差异

    delphi 创建DBASE和FOXPRO两类DBF数据文件的差异,主要有几点: 1.创建方法不同 DBASE的创建方法: Self.Table1.Close; Self.Table1.Active ...

  9. nginx配置相关

    一.autoindex on; 能解决无端端的403问题. 二.NGINX配置超时时间 1.啥时候用到 用来设置请求资源和服务器返回的时间,保证一个请求占用固定时间,超出后报504超时!这样可以保证一 ...

  10. HTML5的新事件

    HTML 元素可拥有事件属性,这些属性在浏览器中触发行为,比如当用户单击一个 HTML 元素时启动一段 JavaScript. HTML 元素可拥有事件属性,这些属性在浏览器中触发行为,比如当用户单击 ...