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

续上篇《使用java多线程顺序打印“ABCABC”》

 
阅读更多
上篇《使用java多线程顺序打印“ABCABC”》说明了,怎样使用多线程连续打印出“ABCABC”。我突然想试试如果不加锁会怎么样?加锁与不加锁的性能比又如何。

代码如下
package com.jrkui.thread;

import com.jrkui.util.ThreadUtil;

public class OrderPrintThread2 extends Thread{
	private Lock lock;
	private String flag;
	
	public OrderPrintThread2(String flag, Lock lock) {
		this.flag = flag;
		this.lock = lock;
		setName("Thread " + flag);
	}
	
	@Override
	public void run() {
		int count = 10;
		while(count > 0)
		{
			if(lock.getFlag().equals(flag))
			{
				System.out.println(flag);
				count--;
				
				if("A".equals(flag))
					lock.setFlag("B");
				else if("B".equals(flag))
					lock.setFlag("C");
				else if("C".equals(flag))
					lock.setFlag("A");
			}
		}
	}
	
	public static void main(String[] args) {
		ThreadUtil.timeRuntimeShutDown();
		
		Lock lock = new Lock();
		lock.setFlag("A");
		OrderPrintThread2 thread1 = new OrderPrintThread2("A", lock);
		OrderPrintThread2 thread2 = new OrderPrintThread2("B", lock);
		OrderPrintThread2 thread3 = new OrderPrintThread2("C", lock);
		
		thread1.start();
		thread2.start();
		thread3.start();
	}
}

运行第一遍时,我很奇怪的发现,竟然也能顺序打印出“ABCABC...”,难道不用加锁也可以吗?于是我尝试着输出更多的信息,比如在调用"Lock#setFlag"方法中输出当前线程名与输入的flag值,这时就发现不同了,顺序完全是混乱的。而且在运行多次时,偶尔还会发现有死锁的情况。这就说明,不加锁肯定是有潜在的问题的,即使输出的结果貌似是一样的。但是至于为什么会这样,光凭打印出的信息很难判断,需要深入到java线程的实现机制才能知道了。

至于加锁与不加锁的性能比,不加锁花的时间是加锁的5~10倍。
分享到:
评论

相关推荐

    java信号量控制线程打印顺序的示例分享

    主要介绍了java信号量控制线程打印顺序的示例,如ABCABC这样输出线程,大家参考使用吧

    <二>、C++实现多线程的同步处理:控制ABC的输出顺序,输出10组,mutex+condition-variable源码示例

    有三条线程,可以分别输出A、B、C字符,现想办法控制输出顺序,使得顺序为ABCABC......ABC[共10组],并且每条线程只能启动一次,不能多次启动。 需要3条线程输出不同的字符,分别为A、B、C,并且顺序要固定住:...

    <一>、C++实现多线程的同步处理:控制ABC的输出顺序,输出10组,mutex+condition-variable源码示例

    要在标准C++中使用多线程,可以使用类 thread,3条线程,我们可以直白一些,直接实现3个线程函数,在函数里面进行循环输出对应字符,每个循环控制10次即可;同时,要想控制输出顺序的话,最开始想到的方式是直接加一...

    浅谈Python3多线程之间的执行顺序问题

    一个多线程的题:定义三个线程ID分别为ABC,每个线程打印10遍自己的线程ID,按ABCABC……的顺序进行打印输出。 我的解法: from threading import Thread, Lock # 由_acquire解锁执行后释放_release锁 def _print(_...

    【并发编程】 — 线程间的通信wait、notify、notifyAll

    三个线程顺序打印问题2.1.1 题目2.1.2 题目分析2.1.3 我的答案2.2 生产者消费者问题2.2.1 题目2.2.2 题目分析2.2.3 我的答案 源码地址:https://github.com/nieandsun/concurrent-study.git 1 wait、notify、...

    云erp源码java-Java-:Java-

    云erp源码 java progress教程 ssm框架整合 ssm整合简例 ssm整合activemq Java虚拟机 码云开源ERP项目(财务) 易源数据 别人的笔记 程序员外包接单 ...密码:abcABC123 ...多线程读写文件 springboot整合其他软件技术

    zuoye03.java

    编写自定义的字符串一致性匹配方法,只要两个字符串包含同样的字符,不管字符的顺序如何,都认为两个字符串一致,如:”aabbcc”和”abcabc”被认为是一致的

    cpp代码-abcabc.cpp

    cpp代码-abcabc.cpp

    ABCabcadbc

    sferfrefwefeqrfrefref

    Java中的String为什么是不可变的?

    什么是不可变对象?  众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成...  String s = ABCabc;  System.out.println(s = + s);  s = 1

    Java中的String为什么是不可变的?? String源码分析

    什么是不可变对象?  众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建...  String s = "ABCabc";  System.out.println("s = " + s);  s = "1

    注册123123

    硬盘序列号查询工具,看计算机硬盘序列号使用工具。!!!

    浅析正则表达式中的lastIndex以及预查

    console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg2.test('abcabc'))...

    Netflix-Clone:这是我作为React.js,Redux,Firebase和Stripe集成教程的一部分制作的Netflix克隆

    我会尽快谈谈这个克隆更多的在我的网站。 建于 React.js Redux工具包(针对全局状态) Firebase(用于后端身份验证,存储和托管) 条带集成(用于付款处理) 实时链接和演示 上面的演示中描绘的是本教程提供的...

    javalruleetcode-LeetCode:力码

    java lru leetcode Leetcode 体验:从 212 开始: 注意,有时我们不需要实例化一个栈和一个visit[][]来跟踪访问信息,只需改变原板上的数据就可以显着降低时间和空间复杂度,只要记住把完成搜索后返回原始值 要构建...

    freemarker总结

    这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的 null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变 量完全相同. 为了处理缺失...

    正则表达式问号的四种用法详解

    原文符号 因为?在正则表达式中有特殊的含义,所以如果想匹配?本身,则需要转义,\? 有无量词 问号可以表示重复前面内容的0次或一次,也...在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配 string pattern1

    javaguivirgerene

    txt格式的Encriptado Vigenere。 实施纲领性工作,并在维吉涅尔省的城市历史档案中... 从本质上来说,“ b”本身就是“ a”和“ a”本身就是“”。 由ejemplo,com entreda tenemos la cadena abcABC1,prima parte es

    LeetCode每日一题(1) 字符串最大公因子

    废话不多说了,先上题目。 题目描述: 对于字符串 S 和 T,只有在 S = T + … + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。 返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。 示例...

Global site tag (gtag.js) - Google Analytics