`
jrkui
  • 浏览: 10386 次
  • 性别: 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信号量控制线程打印顺序的示例分享

    使用信号量能有效地解决多线程间的同步问题,防止资源的竞争条件,确保特定的执行顺序。在这个示例中,通过巧妙地分配和释放信号量,实现了线程A、B、C按特定顺序打印字符,避免了可能的乱序输出。 5. **应用场景...

    <二>、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多线程之间的执行顺序问题

    在给出的标题和描述中,提出了一个具体的问题:如何控制三个线程按照特定的顺序(ABCABC…)打印它们的线程ID。这个问题的关键在于同步机制,也就是如何确保线程间按照特定顺序执行。 在提供的代码中,使用了`...

    迅雷技术招聘java试题

    题目要求实现线程交替打印"ABCABC…",这通常需要使用同步机制,如synchronized关键字或wait/notify机制。 【字符串处理】 题目要求移除字符串中的特定字符,而不使用内置字符串方法。可以使用字符数组遍历并构建新...

    【并发编程】 — 线程间的通信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、...

    JAVA正则表达式--Pattern和Matcher

    ### JAVA正则表达式——Pattern和Matcher详解 #### 一、引言 随着JDK 1.4的发布,Java终于内置了自己的正则表达式API,这对于Java开发者来说无疑是个福音,意味着不再需要依赖第三方库就能高效地处理文本数据。Java...

    计算机JAVA程序和平日练习

    12. **Java 抽象类与接口**:Java 中,方法的重载允许同一类中有多个同名但参数列表不同的方法;abstract 修饰的类是抽象类,不能被实例化;接口是完全抽象的,不包含成员变量的初始化和方法实现;构造方法在 Java ...

    计算机笔试题库集(含有答案)

    题中提到的实现三个线程循环打印“ABCABC…”,可以通过继承Thread类或实现Runnable接口,并使用synchronized关键字控制同步,确保打印顺序。 6. **字符串处理**:去除字符串中特定字符,不使用内置方法,可以...

    云erp源码java-Java-:Java-

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

    JAVA 正则表达式总结_V2

    - **分组与反向引用**:使用圆括号`()`创建分组,可以通过`\数字`进行反向引用,如 `(abc)\1` 将匹配 "abcabc"。 - **选择分支**:`|` 符号用于表示多个选项,如 `a|b` 可匹配 'a' 或 'b'。 - **预定义字符类**:...

    zuoye03.java

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

    人教版一年级上册数学应用题专项练习直接打印.pdf

    2. **加减法运算**:初步接触加法和减法,通常是通过实物操作,如使用计数器或者实物模型,帮助孩子理解加法是合并两个或多个数量,减法是减少一部分数量。初期的加减法题目通常不会超过10的运算。 3. **图形与空间...

    2022java开发博华广场-国泰君安资产托管部数据岗笔试题.docx

    这篇文档是关于2022年国泰君安资产托管部数据岗位的Java开发笔试题,主要涵盖了Java语言的基础知识,包括对象的相等性、字符串的比较以及SQL的插入语句。 首先,题目考察了Java中基本类型与包装类的相等性。在Java...

    在Java编程中使用正则表达式的基本方法

    在Java中,自JDK 1.4起,引入了java.util.regex包,使得Java程序可以方便地使用正则表达式。java.util.regex包中的主要类有Pattern和Matcher。Pattern类用于编译正则表达式,生成一个模式对象。Matcher类用于对输入...

    cpp代码-abcabc.cpp

    标题 "cpp代码-abcabc.cpp" 暗示我们正在讨论一个C++源代码文件,可能是一个特定功能的实现或示例。描述同样简洁,没有提供额外的信息,所以我们主要依赖标签和子文件来推测可能的知识点。 标签 "代码" 明确地告诉...

    Java 中的 String对象为什么是不可变的

    1. **线程安全**:由于String对象不可变,所以在多线程环境中,多个线程可以安全地共享同一个String对象,无需担心同步问题。这提高了程序的并发性能。 2. **缓存哈希码**:String对象经常用于HashMap等数据结构中...

Global site tag (gtag.js) - Google Analytics