上篇《使用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倍。
分享到:
相关推荐
使用信号量能有效地解决多线程间的同步问题,防止资源的竞争条件,确保特定的执行顺序。在这个示例中,通过巧妙地分配和释放信号量,实现了线程A、B、C按特定顺序打印字符,避免了可能的乱序输出。 5. **应用场景...
有三条线程,可以分别输出A、B、C字符,现想办法控制输出顺序,使得顺序为ABCABC......ABC[共10组],并且每条线程只能启动一次,不能多次启动。 需要3条线程输出不同的字符,分别为A、B、C,并且顺序要固定住:...
要在标准C++中使用多线程,可以使用类 thread,3条线程,我们可以直白一些,直接实现3个线程函数,在函数里面进行循环输出对应字符,每个循环控制10次即可;同时,要想控制输出顺序的话,最开始想到的方式是直接加一...
在给出的标题和描述中,提出了一个具体的问题:如何控制三个线程按照特定的顺序(ABCABC…)打印它们的线程ID。这个问题的关键在于同步机制,也就是如何确保线程间按照特定顺序执行。 在提供的代码中,使用了`...
题目要求实现线程交替打印"ABCABC…",这通常需要使用同步机制,如synchronized关键字或wait/notify机制。 【字符串处理】 题目要求移除字符串中的特定字符,而不使用内置字符串方法。可以使用字符数组遍历并构建新...
三个线程顺序打印问题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详解 #### 一、引言 随着JDK 1.4的发布,Java终于内置了自己的正则表达式API,这对于Java开发者来说无疑是个福音,意味着不再需要依赖第三方库就能高效地处理文本数据。Java...
12. **Java 抽象类与接口**:Java 中,方法的重载允许同一类中有多个同名但参数列表不同的方法;abstract 修饰的类是抽象类,不能被实例化;接口是完全抽象的,不包含成员变量的初始化和方法实现;构造方法在 Java ...
题中提到的实现三个线程循环打印“ABCABC…”,可以通过继承Thread类或实现Runnable接口,并使用synchronized关键字控制同步,确保打印顺序。 6. **字符串处理**:去除字符串中特定字符,不使用内置方法,可以...
云erp源码 java progress教程 ssm框架整合 ssm整合简例 ssm整合activemq Java虚拟机 码云开源ERP项目(财务) 易源数据 别人的笔记 程序员外包接单 ...密码:abcABC123 ...多线程读写文件 springboot整合其他软件技术
- **分组与反向引用**:使用圆括号`()`创建分组,可以通过`\数字`进行反向引用,如 `(abc)\1` 将匹配 "abcabc"。 - **选择分支**:`|` 符号用于表示多个选项,如 `a|b` 可匹配 'a' 或 'b'。 - **预定义字符类**:...
编写自定义的字符串一致性匹配方法,只要两个字符串包含同样的字符,不管字符的顺序如何,都认为两个字符串一致,如:”aabbcc”和”abcabc”被认为是一致的
2. **加减法运算**:初步接触加法和减法,通常是通过实物操作,如使用计数器或者实物模型,帮助孩子理解加法是合并两个或多个数量,减法是减少一部分数量。初期的加减法题目通常不会超过10的运算。 3. **图形与空间...
这篇文档是关于2022年国泰君安资产托管部数据岗位的Java开发笔试题,主要涵盖了Java语言的基础知识,包括对象的相等性、字符串的比较以及SQL的插入语句。 首先,题目考察了Java中基本类型与包装类的相等性。在Java...
在Java中,自JDK 1.4起,引入了java.util.regex包,使得Java程序可以方便地使用正则表达式。java.util.regex包中的主要类有Pattern和Matcher。Pattern类用于编译正则表达式,生成一个模式对象。Matcher类用于对输入...
标题 "cpp代码-abcabc.cpp" 暗示我们正在讨论一个C++源代码文件,可能是一个特定功能的实现或示例。描述同样简洁,没有提供额外的信息,所以我们主要依赖标签和子文件来推测可能的知识点。 标签 "代码" 明确地告诉...
1. **线程安全**:由于String对象不可变,所以在多线程环境中,多个线程可以安全地共享同一个String对象,无需担心同步问题。这提高了程序的并发性能。 2. **缓存哈希码**:String对象经常用于HashMap等数据结构中...