测试有锁与无锁CAS的性能

原创 2018年04月15日 14:14:09

 出于对高并发的兴趣,对此做了个有锁与无锁CAS的性能测试

代码如下:

package bingFa_4;

import java.util.concurrent.atomic.AtomicInteger;

public class Test3 {
	static AtomicInteger sum1 = new AtomicInteger();
	static int sum2 = 0;
	static int sum3 = 0;
	static Object obj = new Object();
	//循环个数
	static int count = 10000; 
	
	//测试无锁的原子类
	public static class AddThread1 implements Runnable
	{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			for(int k=0; k<count; k++)
				sum1.incrementAndGet();
		}
	}
	
	//测试在循环体内加锁
	public static class AddThread2 implements Runnable
	{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			
			for(int k=0; k<count; k++)
			{
				synchronized(obj)
				{
					sum2++;
				}
			}
		}
	}
	
	//测试在循环体外加锁
	public static class AddThread3 implements Runnable
	{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			synchronized(obj)
			{
				for(int k=0; k<count; k++)
					sum3++;
			}
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		long start = System.currentTimeMillis();
		//线程数
		int thread_count = 10;
		
		Thread[] ts = new Thread[thread_count];
		for(int i=0; i<thread_count; i++)
		{
			ts[i] = new Thread(new AddThread1());
			ts[i].start();
		}
		for(int i=0; i<thread_count; i++)
			ts[i].join();
		long end = System.currentTimeMillis();
		System.out.println("CAS: \t\t"+(end-start) + " ms, sum1="+sum1 );
		
		start = System.currentTimeMillis();
		ts = new Thread[thread_count];
		for(int i=0; i<thread_count; i++)
		{
			ts[i] = new Thread(new AddThread2());
			ts[i].start();
		}
		for(int i=0; i<thread_count; i++)
			ts[i].join();
		end = System.currentTimeMillis();
		System.out.println("AddThread1,循环锁: "+(end-start)+ " ms, sum2="+sum2);
		
		start = System.currentTimeMillis();
		ts = new Thread[thread_count];
		for(int i=0; i<thread_count; i++)
		{
			ts[i] = new Thread(new AddThread3());
			ts[i].start();
		}
		for(int i=0;i<thread_count; i++)
			ts[i].join();
		end = System.currentTimeMillis();
		System.out.println("AddThread2,锁循环: "+(end-start)+ " ms,  sum3="+sum3);
	}
}


对于10个线程, 循化++,10000次


对于100个线程, 循化++,10000次


对于100个线程, 循化++,100000次


从结果来看, 速度快慢的顺序是: AddThread3(锁冲突很少)>AddThread1(比较和交换略多)>AddThread2(锁冲突多)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31281327/article/details/79948817

java高并发:CAS无锁原理及广泛应用

前言在现在的互联网技术领域,用户流量越来越大,系统中并发量越来越大,大公司的日活动辄成百上千万。如何面对如此高的并发是当今互联网技术圈一直在努力的事情。 应对高并发需要在各个技术层面进行合理的设计和...
  • fgyibupi
  • fgyibupi
  • 2016-12-20 12:53:39
  • 7420

无锁算法——CAS原理

一、无锁算法CAS(比较与交换,Compare and swap) 是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非...
  • Roy_70
  • Roy_70
  • 2017-04-09 09:32:28
  • 2319

无锁编程和有锁编程效率对比

最近维护的一个网络服务器遇到性能问题,于是就对原有的程序进行了较大的框架改动。改动最多的是线程工作模式与数据传递方式,最终的结果是改变锁的使用模式。经过一番改进,基本上可以做到 GMb 网卡全速工作处...
  • cws1214
  • cws1214
  • 2015-08-15 12:10:18
  • 2379

JAVA非阻塞同步算法与CAS无锁算法

JDK1.5之前靠synchronized关键字保持同步,采用独占方式访问变量 乐观锁与悲观锁 独占锁是悲观锁,然而synchronized是独占锁(悲观的),它会导致其他需要锁的线程挂起,等待那...
  • qq_27602093
  • qq_27602093
  • 2017-04-04 20:44:58
  • 469

锁与CAS介绍

转载:http://www.blogjava.net/xylz/archive/2010/07/04/325206.html             http://www.tuicool.com/a...
  • zero__007
  • zero__007
  • 2015-02-06 20:19:41
  • 2421

java并发 非阻塞同步算法与CAS(Compare and Swap)无锁算法

锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,加锁、释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放...
  • j754379117
  • j754379117
  • 2015-08-09 00:14:44
  • 1525

CAS无锁操作

CAS原理: CAS原语有三个参数,内存地址,期望值,新值。如果内存地址的值==期望值,表示该值未修改,此时可以修改成新值。否则表示修改失败,返回false,由用户决定后续操作。 缺点: 使用CAS...
  • chinabhlt
  • chinabhlt
  • 2015-06-24 10:01:41
  • 1862

一种基于CAS的无锁并发HashTable设计及C代码实现

在多线程环境下,我们常常用Java的ConcurrentHashMap,但其实这个Map仍然是要使用锁的,只不过使用了一种被称为StripeLock的方式。这里我们试着实现一个完全无锁的HashTab...
  • Sefler
  • Sefler
  • 2013-05-12 12:27:35
  • 4311

无锁程序设计(CAS)

以下笔记主要来自:Coolshell - 无锁队列的实现。 CAS操作 所谓CAS指Compare and Set(或Compare and Swap)。现在几乎所有CPU指令都支持CAS,如X8...
  • fei0724
  • fei0724
  • 2014-01-20 16:00:06
  • 1905

linux下锁/无锁性能比较

代码示例中三种类型: 1.pthread_mutex_t,互斥锁 2.__sync_add_and_fetch,GCC自带的原子锁 3.nolock,无...
  • innobase
  • innobase
  • 2017-01-13 18:04:30
  • 683
收藏助手
不良信息举报
您举报文章:测试有锁与无锁CAS的性能
举报原因:
原因补充:

(最多只允许输入30个字)