`
cloudeagle_bupt
  • 浏览: 579070 次
文章分类
社区版块
存档分类
最新评论

互斥锁读取与顺序读取性能比较

 
阅读更多
package concurrencyTest;

import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.hama.graph.GraphJobMessage;


public class ConcurrencyReadTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ConcurrentHashMap<Integer, Integer>  map = new ConcurrentHashMap<Integer, Integer>() ;
		for(int i=0;i<100000 ; i++)
			map.put(i, i+111111) ;
		
		long start = System.currentTimeMillis() ;
		Thread t1 = new Thread(new Worker(map)) ;
		Thread t2 = new Thread(new Worker(map)) ;
		
		t1.start(); 
		t2.start();
		
		try {
			t1.join() ;
			t2.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Read last : " + (System.currentTimeMillis() - start) + " ms");
	}

	
}

class Worker implements Runnable {
	ConcurrentHashMap<Integer, Integer>  sharemap ;
	public static Object mutex = new Object() ;
	
	public Worker(ConcurrentHashMap<Integer, Integer> map) {
		sharemap = map ;
	}
	
	@Override
	public void run() {
		 it = sharemap.values().iterator();
		 Integer i = poll(); 
		 while(i!=null) {
			 int k = i ;
			 i = poll() ;
		 }
	}
	

	Iterator<Integer> it;

	public Integer poll() {
		synchronized (mutex) {
		     if (sharemap.size() > 0 && it!=null && it.hasNext()) {
		         Integer m = it.next();
		         it.remove();
		         return m;
		       } else {
		         return null;
		       }
		}
	}
}


顺序:

46
46
47

并发
63
78
63


增大到100万条数据:

并发

312
312
327

顺序
188
187
187


可见锁对性能影响之大!


分享到:
评论

相关推荐

    PHP程序中的文件锁、互斥锁、读写锁使用技巧解析

    而读写锁(也称为共享-独占锁或共享互斥锁)则允许多个线程同时读取资源,但只有一个线程可以写入资源,这样既提高了并发读取的效率,又保证了数据的一致性。 在PHP中,可以通过sync扩展模块实现互斥锁和读写锁。...

    同步读锁,异步互斥写锁源码

    首先,我们需要了解锁的基本类型:互斥锁(Mutex)和读写锁(Read-Write Lock)。互斥锁提供独占式访问,即一次只允许一个线程访问共享资源,保证了写操作的安全性。而读写锁则进一步区分了读取和写入操作,允许多个...

    C语言信号量同步与互斥生产者消费者互斥锁读写者问题哲学家就餐问题课程设计

    C语言信号量同步与互斥生产者消费者互斥锁读写者问题哲学家就餐问题课程设计 本课程设计旨在通过C语言编程来解决信号量机制下的同步、互斥、生产者消费者问题、哲学家就餐问题和读写者问题。 一、信号量机制 信号...

    JavaScript的互斥(mutex)对象。-JavaScript开发

    基于承诺的互斥锁允许顺序执行相同的异步操作。 一个典型的用例示例是检查资源是否存在,并作为原子异步操作读取/创建资源。 互斥(mutex)JavaScript的互斥(mutex)对象。 动机API配置用法示例图像服务器示例相关...

    进程的互斥与同步

    消费者则等待事件信号,获取互斥锁,读取缓冲区数据,释放锁,然后再次等待新的事件信号。 总结来说,理解和掌握进程的互斥与同步对于编写高效、稳定的并发程序至关重要。在Windows环境中,利用提供的API函数,如...

    读写锁 改进版

    在传统的互斥锁中,只有一个线程可以访问资源,而读写锁则允许多个读线程同时访问,但当有写线程时,所有读线程和写线程都会被阻塞,确保写操作的原子性和一致性。在高并发环境中,读写锁能够显著提升系统性能,因为...

    读写锁源代码(C#编写)

    3. **升级与降级**:C#的读写锁还支持锁的升级和降级。这意味着一个线程可以在持有读锁的情况下升级为写锁(写升级),并在完成写操作后降级回读锁(写降级)。这是一个高级特性,但需要谨慎使用,因为错误的操作...

    读写锁,不支持重入

    3. **性能优化**:根据应用需求,选择合适的锁实现,如自旋锁、互斥量等,以平衡性能和同步开销。 综上所述,不支持重入的读写锁是一种重要的多线程同步工具,它在保证数据一致性的同时,通过限制锁的重入性来防止...

    Java中的锁分类与使用.docx

    3. **互斥锁/读写锁** - **互斥锁**(如ReentrantLock)保证了在同一时间只有一个线程访问资源,防止数据不一致。 - **读写锁**(如ReadWriteLock)进一步细分为读锁和写锁,读锁可被多个线程共享,写锁是独占的,...

    多线程编程指南PDF

    - **设置互斥锁的强健属性**:设置互斥锁的强健性,确保即使在异常情况下也能正确释放。 - **获取互斥锁的强健属性**:查询互斥锁的强健性。 - **使用互斥锁**: - **初始化互斥锁**:创建一个新的互斥锁。 - *...

    读写锁rwlock读写锁rwlock

    读写锁(Read-Write Lock,简称rwlock)是多线程编程中一种重要的同步机制,主要用于提高多个...在实际项目中,根据具体场景选择合适的同步机制,如互斥锁、读写锁或其他高级同步原语,是提高软件质量和性能的关键。

    Java锁的种类以及区别

    #### 四、互斥锁与读写锁 **1. 互斥锁** 互斥锁也称为独占锁或写锁,它确保同一时间内只有一个线程能够执行临界区内的代码。这种锁通常用于保护对共享资源的写操作,以防止数据不一致性。 **2. 读写锁** 读写锁...

    07--Linux系统编程-线程同步.pdf

    在使用互斥锁时需要注意,互斥锁并不会自动锁定,每个线程在对共享资源进行操作前都需要尝试加锁,操作结束后需要释放锁。此外,互斥锁虽然能够防止多个线程同时访问共享资源,但它们并不是强制性的,如果有线程不按...

    Java 中15种锁的介绍

    - **独享锁**(互斥锁) 只允许一个线程访问共享资源,如`ReentrantLock`的独占模式。 - **共享锁**(读写锁)允许多个线程同时读取,但只有一个线程可以写入,如`ReentrantReadWriteLock`。 4. **互斥锁** 类似...

    用线程、进程表示同步和互斥

    在这些共享区域上设置互斥锁,确保只有一个线程可以写入或读取。对于进程,可以使用进程间通信(IPC)机制,如管道、消息队列、共享内存等,来实现同步和互斥。 例如,可以设计一个简单的银行账户类,包含一个余额...

    详解Java多线程编程中互斥锁ReentrantLock类的用法

    9. **可读写的锁**:虽然ReentrantLock主要关注互斥锁,但Java并发包中还有ReentrantReadWriteLock,它提供了读写锁,允许多个读取线程同时访问资源,而写入操作仍然保持互斥。 总结来说,ReentrantLock提供了比...

    java并发分享.ppt

    然而,互斥锁会导致并发性能下降,因为它将多任务执行变成了单任务执行,而且如果使用不当,可能导致死锁。 共享锁,顾名思义,允许多个线程同时持有锁,但通常只允许读取操作,不允许修改数据,常用于读多写少的...

    vc++分别用单-多线程读取数字

    4. **性能比较**: 单线程与多线程的性能差异取决于具体的应用场景。在读取数字这种简单任务中,多线程可能不会带来显著的性能提升,因为I/O操作(如键盘输入)往往是阻塞的,无法被并行化。但在处理大量计算密集型...

    锁实现lock

    在实际应用中,还可以使用读写锁(read-write lock,即`pthread_rwlock_t`)来优化读多写少的情况,允许多个线程同时读取但仅允许一个线程写入。 最后,记得在程序结束时销毁锁: ```c pthread_mutex_destroy(&lock...

Global site tag (gtag.js) - Google Analytics