`
sxpyrgz
  • 浏览: 72325 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Atomic LOCK synchronized性能测试

    博客分类:
  • java
 
阅读更多

今天测试了多线程并发计数的性能:结果测试性能为:

计数类型 运行时间 执行结果  
同步 478 10000000  
lock 434 10000000  
AtomicInteger 739 10000000  
none 417 错误  

测试结果显示原子操作性能还是比较的差;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;

public class Counter {
 
	private AtomicInteger atomicI = new AtomicInteger(0);
	ReentrantLock lock = new ReentrantLock();
	private int m = 0;
	private  int k = 0;
	private  int l = 0;
	public static void main(String[] args) {
		atomic(1);
		atomic(2);
		atomic(3);
		atomic(4);
	}
	
	public static void atomic(final int type){
		final Counter cas = new Counter();
		List<Thread> ts = new ArrayList<Thread>(600);
		long start = System.currentTimeMillis();
		for (int j = 0; j < 10000; j++) {
			Thread t = new Thread(new Runnable() {
				@Override
				public void run() {
					for (int i = 0; i < 1000; i++) {
						//cas.count();
						if(type==1){
							cas.safeCount();
						}else if(type==2){
							cas.count2();
						}else if(type==3){
							cas.count();
						}else if(type==4){
							cas.count1();
						}
					
						//cas.count1();
					}
				}
			});
			ts.add(t);
		}

		for (Thread t : ts) {
			
			t.start();
		}
		// 等待所有线程执行完成
		for (Thread t : ts) {
			try {
				t.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		if(type==1){
			System.out.println(type +"automic操作"+cas.atomicI.get());
		}else if(type==2){
			System.out.println(type +"lock:操作"+cas.m);
		}else if(type==3){
			System.out.println(type +"synchronized:操作"+cas.k);
		}else if(type==4){
			System.out.println(type +"none:操作"+cas.l);
		}
	 
	
		
	
		System.out.println(System.currentTimeMillis() - start);
	}

	 
	/**
	 * 使用CAS实现线程安全计数器
	 */
	private void safeCount() {
		 
		 atomicI.incrementAndGet();
			 
	}
	/**
	 * 非线程安全计数器 存在竞争争条件,所以计算有错误 
	 */
	private void count1() {
		
		l++;
		 
	}
	/**
	 * 同步线程安全计数器
	 */
	private synchronized void count() {
	 
		k++;
	 
	}
	/**
	 * 锁线程安全计数器
	 */
	private void count2() {
		//如果不加锁会计算出问题
		lock.lock();
		try{
		m++;
		}catch(Exception e ){
			
		}finally{
			lock.unlock();
		}
	}
}

 

分享到:
评论

相关推荐

    Lock、Synchoronized和ReentrantLock的使用

    Atomic 的性能比 Synchronized 略逊,但是在激烈竞争的情况下,Atomic 的性能可以维持常态。Atomic 的缺点是只能同步一个值,一段代码中只能出现一个 Atomic 变量,多于一个同步无效。 四、性能比较 通过实验,...

    简单了解synchronized和lock的区别

    lock是Java 5中引入的API,用于实现线程同步,主要是为了解决synchronized的性能问题。Lock接口提供了lock、unlock和tryLock等方法,用于控制线程的执行顺序。Lock接口的实现类有ReentrantLock、...

    第15讲synchronized和ReentrantL1

    线程安全的实现通常依赖于同步机制,如`synchronized`和`ReentrantLock`,以及其他的并发工具,如`volatile`关键字、`Atomic`类等。理解这些机制的底层实现,例如锁膨胀、降级、自旋锁、轻量级锁和重量级锁等,对于...

    并发编程 70 道面试题及答案.docx

    为了避免并发编程中的各种问题,Java 提供了多种同步机制,包括synchronized、volatile、CAS、Lock 等。 1. synchronized synchronized 是 Java 的一条关键字,用于实现方法或代码块的同步。synchronized 可以修饰...

    Java生产环境下性能监控与调优详解课程笔记(完整版)

    2. Lock与Synchronized:根据场景选择合适的锁机制,优化同步开销。 3. volatile关键字:理解其作用和限制,避免不必要的线程可见性问题。 4. Atomic类:使用无锁编程技术提升并发性能。 五、数据库优化 1. SQL...

    Java性能优化.docx

    因此,理解synchronized、Lock、Atomic类等并发工具的使用和性能影响是必要的。此外,避免空转等待、减少I/O操作、使用高效的数据结构和算法等也是代码优化的重要手段。 问题定位工具的使用是性能优化不可或缺的一...

    大话java性能优化 周明耀 完整版

    - **锁优化**:理解锁的粒度,如使用synchronized,Lock,或使用原子变量类(Atomic*)来减少锁竞争,提高并发性能。 - **并发集合**:使用并发安全的数据结构,如ConcurrentHashMap,CopyOnWriteArrayList等,...

    java-synchronized 嵌套使用代码详解

    解决死锁的方法是,避免使用 synchronized 的嵌套使用,而是使用其他同步机制,例如 Lock 对象或 atomic 变量。同时,需要确保线程安全,避免线程之间的竞争关系。 总结来说,java-synchronized 嵌套使用代码详解是...

    线程安全测试类

    本测试主要关注`synchronized`关键字的使用,以及它如何影响线程同步和线程执行顺序。 `synchronized`关键字是Java中用于实现线程同步的关键机制,它确保同一时间只有一个线程可以执行特定的代码块或方法。当一个...

    Java 多线程与并发(7-26)-JUC - 类汇总和学习指南.pdf

    JUC 框架包含多个部分,包括 Lock 框架、Tools 类、Collections、Atomic、Executors 等。下面是每个部分的详细解释: 1.Lock 框架和 Tools 类: Lock 框架提供了一种更灵活的锁定机制,可以代替 synchronized 方法...

    LockFreeList:LockFreeList

    LockFreeList-master这个文件名可能表示这是一个开源项目,可能包含了LockFreeList的完整实现,包括测试和示例代码。对于学习和理解无锁编程以及Java并发,研究这个项目会是一个很好的实践。 总结来说,LockFree...

    Java线程同步与 Java 并发设施.pdf

    在Java中,线程同步可以通过多种方式实现,如synchronized关键字、java.util.concurrent.locks.Lock接口以及java.util.concurrent.atomic包中的原子操作类。 synchronized关键字是Java中的一种内置同步机制,它可以...

    Java多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池)

    JUC(Java.util.concurrent)是 Java 语言中的并发工具包,提供了一些高效的线程安全的工具类,包括 Atomic 变量、Lock 锁、Semaphore 信号量、CountDownLatch 计数器、CyclicBarrier 栅栏、ThreadPool 线程池等。...

    如何来提高自己对java的性能上提高

    - **避免线程安全问题**:使用`synchronized`关键字或`Lock`实现线程同步,防止数据不一致。 - **理解并发容器**:例如`ConcurrentHashMap`比`synchronized HashMap`更适合多线程环境。 4. **CPU优化**: - **...

    Java多线程中Lock锁的使用总结

    Java提供了多种线程同步机制,包括synchronized关键字、Lock接口和Atomic变量等。 知识点10: Java中的线程通信机制 Java中的线程通信机制是用于解决多线程之间的通信问题的。Java提供了多种线程通信机制,包括wait...

    Java多线程 - (一) 最简单的线程安全问题

    3. **Lock接口**:Java提供`java.util.concurrent.locks.Lock`接口,提供了比`synchronized`更细粒度的锁控制,如可重入锁、公平锁等。例如,`ReentrantLock`。 ```java import java.util.concurrent.locks.Lock; ...

    java常用锁使用demo工程

    在这个工程中,我们可能会看到各种锁的实例,如内置锁(synchronized)、显式锁(java.util.concurrent.locks包中的Lock接口)以及相关的同步工具类。 1. 内置锁(Synchronized): - **同步方法**:通过在方法...

    java synchronized关键字的用法

    - Lock 接口(如 ReentrantLock、ReadWriteLock):提供了比 synchronized 更灵活的锁管理。 - volatile 关键字:用于保证变量的可见性和禁止指令重排序,适用于读多写少的情况。 - Atomic 类(如 AtomicInteger、...

Global site tag (gtag.js) - Google Analytics