`
axxxx2000
  • 浏览: 6451 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

线程测试--疑惑

    博客分类:
  • java
阅读更多
今天看了下线程中ReentrantLock类,便根据网上的资料写了个测试代码?
结果发现每次运行速度都不一样很纳闷。。。。。特来求教--哪出问题了?
ps:网上说  Tim Peierls 用一个简单的线性全等伪随机数生成器(PRNG)构建了一个简单的评测
    哪位大虾有这评测,能否提供,感激不尽!

public class ReentrantLockTest {
	    private CyclicBarrier barrier;
	    private Object objTest;
	    private int threadNum;

	    public ReentrantLockTest(int threadNum) {
	        barrier = new CyclicBarrier(threadNum + 1);
	        this.threadNum = threadNum;
	    }

	    public static void main(String args[]) {
	    	int threadCount = 5000;
	    	ReentrantLockTest test4 = new ReentrantLockTest(threadCount);
	    	test4.objTest = test4.new ReentrantLockUnFair();
	    	test4.test();
	    	
	    	ReentrantLockTest test1 = new ReentrantLockTest(threadCount);
	    	test1.objTest = test1.new ReentrantLockFair();
	    	test1.test();
	    	ReentrantLockTest test2 = new ReentrantLockTest(threadCount);
	    	test2.objTest = test2.new ReentrantLockUnFair();
	    	test2.test();	    	

	    	ReentrantLockTest test3 = new ReentrantLockTest(threadCount);
	    	test3.objTest = test3.new SynchronizedTest();
	    	test3.test();
	    }

	    public void test() {
	        try {
	            for (int i = 0; i < threadNum; i++) {
	                new TestThread(objTest).start();
	            }
//	            barrier.await(); // �ȴ����������̴߳���
//	            long start = System.currentTimeMillis();
//	            barrier.await(); // �ȴ���������������
//	            long end = System.currentTimeMillis();
	            
	           //����һ��д��
	            long start = System.currentTimeMillis();
	            barrier.await(); // �ȴ����������̴߳���
	            barrier.await(); // �ȴ���������������
	            long end = System.currentTimeMillis();	
	            
	            System.out.println("����ʱ��:" + (end - start) + "����");
	        } catch (Exception e) {
	            throw new RuntimeException(e);
	        }
	    }

	    class TestThread extends Thread {

	    	private Object obj;
	        public TestThread(Object obj) {
	        	this.obj = obj;
	        }

	        public void run() {
	            try {
	                barrier.await();
	                obj.equals("");
	                barrier.await();
	            } catch (Exception e) {
	                throw new RuntimeException(e);
	            }
	        }
	    }
	    class ReentrantLockFair {
	    	private final Lock lock = new ReentrantLock(true);
	    	public boolean equals(Object obj){
				lock.lock();
				try {
					for(int i=0 ; i<10 ; i++){
					}
				} finally {
					lock.unlock();
				}
	    		return true;
	    	}
	    }
	    class ReentrantLockUnFair {
    		final Lock lock = new ReentrantLock(false);
	    	public boolean equals(Object obj){
	    		lock.lock();
	    		try {
	    			for(int i=0 ; i<10 ; i++){
	    			}
	    		} finally {
	    			lock.unlock();
	    		}
	    		return true;
	    	}
	    }
	    class SynchronizedTest {
	    	public synchronized boolean equals(Object obj){
	    			for(int i=0 ; i<10 ; i++){
	    			}					
	    		return true;
	    	}
	    }
}
分享到:
评论
5 楼 axxxx2000 2009-09-07  
synchronized (obj)
这有问题该是synchronized (this),恩,原来的是错了
4 楼 axxxx2000 2009-09-07  
他执行的equal方法是同一个实例的objTest啊,个人认为有竞争的
3 楼 qianhd 2009-09-04  
axxxx2000 写道
obj.equals("");
会有竞争啊!!


每个线程都new 一个新的lock
哪来的锁竞争?? 
单纯的多线程CPU竞争

如果不是因为Java把""给缓存了
synchronized("") 也不会有任何竞争
2 楼 axxxx2000 2009-09-04  
obj.equals("");
会有竞争啊!!
1 楼 qianhd 2009-09-04  
你代码有问题
你这哪里有锁的竞争???

相关推荐

    为什么多线程容易崩溃呢,我来揭秘下,测试线程运行崩溃例子 -易语言

    献给有需要的人,喜欢的支持下!! 为什么多线程容易崩溃呢,我来揭秘下,测试线程运行崩溃例子 之前写多线程一直疑惑为何突然就崩溃了,一直找不到原因,经过多番测试,终于找到问题所在了。。。给新手一个提示!!

    来自IBM的(POSIX).

    测试结果显示多线程与多进程在处理效率上几乎相同,这与人们的普遍预期不符。这一发现表明,在某些情况下,多线程的优势可能不如预期那样明显,特别是在处理简单任务时。 ### 结论 虽然多线程编程能够提高程序的...

    关于CoreJava同步的疑惑例子

    - `SynchBankTest.java`是测试类,创建多个线程实例并运行`TransferRunnable`,模拟并发转账。通过观察和调试测试结果,我们可以验证同步机制是否有效防止了数据竞争。 4. **并发设计模式** - **生产者消费者模型...

    Python3-廖雪峰[带标签完整版]

    ### Python3基础教程概览与核心...- **常见问题解答**:解决初学者常见的疑惑和问题。 #### 二十三、期末总结 - **回顾与展望**:总结学习成果,规划未来发展。 - **Python 学习路线**:从基础到高级的学习路径建议。

    手机/PDA程序设计入门-整合型开发工具

    - 论坛和技术博客:Stack Overflow、Medium等社区可以解答疑惑,分享经验。 通过深入学习和实践,结合整合型开发工具,你将能够熟练地进行手机/PDA程序设计,创造出自己的移动应用。无论是个人兴趣还是职业发展,这...

    最新scjp310-065题库

    8. **多线程**:线程的创建方式(Thread类和Runnable接口),线程同步(synchronized关键字、wait()、notify()、notifyAll()方法),以及线程池的使用。 9. **反射API**:如何在运行时获取类的信息,如Class对象、...

    廖雪峰Python3.5教程(不带标签)

    - **错误、调试和测试**:讲解异常处理机制、调试技巧及单元测试的重要性。 #### IO编程 - **文件读写**:演示如何打开文件、读取和写入数据。 - **StringIO和BytesIO**:使用内存中的文件对象来进行字符串和二进制...

    威哥小白_兄弟连JavaSE部分笔记

    遇到疑惑时,可以将问题放到这个模型中去验证和推理,最终找到解决问题的方法。 #### 线程与并发的概念 线程是程序执行流的最小单元,是操作系统能够进行运算调度的最小单位。并发是指在同一时间间隔内,系统处理...

    java解惑java解惑java解惑

    在Java的世界里,疑惑可能涵盖语法、类库、框架、并发、内存管理等多个方面。下面,我们将深入探讨一些常见的Java解惑知识点。 1. **Java基础** - **变量与数据类型**:Java支持基本数据类型(如int、double等)和...

    Python-关于Python必看的视频

    10. **单元测试**:学习编写和运行单元测试,使用unittest或pytest等库,确保代码的质量和可靠性。 在观看这些视频教程时,建议按照视频内容的结构逐步学习,同时配合实践项目进行巩固,理论与实践相结合是学习...

    scjp试题。rar

    - **Module5**:可能涵盖多线程和并发,包括线程创建、同步机制(synchronized关键字、wait/notify方法)、线程池等。 - **Module6**:可能涉及到Java内存模型、垃圾回收(Garbage Collection)、类加载机制和反射...

    求职与招聘.zip

    - **技术评估**:可能会有编程测试或在线平台上的实战题目,测试开发者解决问题的能力。 - **团队文化匹配**:除了技术能力,公司也会考察求职者的沟通能力和团队协作精神。 - **职业规划**:理解自己的职业目标...

    SCJP复习资料(书籍来源于官方)

    SCJP考试主要测试考生对Java编程语言的基础理解,包括语法、类库、内存管理、异常处理、多线程、输入/输出(I/O)、集合框架、反射以及JVM工作原理等方面。描述中提到的考试形式包括拖拽题、单选题和多选题。拖拽题...

    Java解惑 中文版

    本书深入浅出地探讨了Java语言的核心概念、常见疑惑以及最佳实践,旨在使开发者能够编写出更稳定、更高效的代码。 Java解惑部分涵盖了诸多主题,包括但不限于: 1. **内存管理**:Java的垃圾回收机制是其一大特色...

    sqlmap-wiki-zhcn::syringe:可能是最完整的sqlmap中文文档

    - **常见问题**:解答用户可能遇到的问题和疑惑。 **Gitbook和中文文档的价值**: 这个中文文档不仅让中国用户更容易理解SQLMap,而且通过Gitbook的版本控制系统,可以追踪文档的更新,确保用户获得最新的信息。...

    北大未名BBS.Delphi版精华区.rar

    - **单元测试和调试**:了解TestComplete、Jedi VCL的JUnit等工具的使用,进行单元测试和调试。 - **代码优化**:学习提高Delphi程序运行效率的方法,如内存管理、算法优化等。 - **第三方库和组件**:研究如何整合...

    卡内基ssd3所有答案

    这些答案集将作为学习过程中的参考资料,帮助解答疑惑,提升学习效率。同时,不断地实践和反思是提升编程能力的关键,希望同学们在查阅答案的同时,也能积极参与编程实践,培养独立解决问题的能力。

    SSD3所有答案,为了大家谋福利

    6. **多线程**:Java支持多线程编程,SSD3可能包含线程的创建、同步、线程池等内容,以及如何避免线程安全问题。 7. **Java Swing或JavaFX**:如果SSD3涉及到GUI编程,那么Java的Swing或JavaFX库可能会被介绍,学习...

    行业文档-设计装置-基于android平台的金融终端设备交易系统.zip

    3. 测试:进行广泛的设备和系统版本测试,确保在各种环境下稳定运行。 五、服务端集成 系统还需要与后端服务器进行紧密集成,实现以下功能: 1. 实时同步:实时获取市场信息,更新账户余额和交易状态。 2. 交易...

Global site tag (gtag.js) - Google Analytics