今天看到这么一道多线程题:有三个线程,每个线程有一个属性flag,假设每个线程的flag值顺序为“A”、“B”、“C”,编写一段代码在控制台顺序输出“ABCABC”。
因为线程执行不是按顺序执行的,如果需要按顺序执行,则需要加锁。现在设想有一个对象“lock”作为这三个线程共用的锁,“lock”控制每个线程的“输出flag值到控制台”的代码。每个线程在start后,都需要去检查是否获得了”lock“的锁(锁的分配是都虚拟机分配的,貌似),如果获得了锁,则执行相关代码,如果没有获得锁,则挂起,等待系统下次调用。
示例代码
package com.jrkui.thread;
public class OrderPrintThread extends Thread{
private Lock lock;
private String flag;
public OrderPrintThread(String flag, Lock lock) {
this.flag = flag;
this.lock = lock;
}
@Override
public void run() {
int count = 2;
while(count > 0)
{
synchronized (lock) {
if(lock.getFlag().equals(flag))
{
System.out.print(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) {
Lock lock = new Lock();
lock.setFlag("A");
OrderPrintThread thread1 = new OrderPrintThread("A", lock);
OrderPrintThread thread2 = new OrderPrintThread("B", lock);
OrderPrintThread thread3 = new OrderPrintThread("C", lock);
thread1.start();
thread2.start();
thread3.start();
}
}
class Lock
{
private String flag;
public void setFlag(String flag) {
this.flag = flag;
}
public String getFlag() {
return flag;
}
}
synchronized关键字就是为”lock“对象加锁。加上synchronized关键字后,每次只能有一个线程调用被加锁的代码段(变量,方法)。
分享到:
相关推荐
使用信号量能有效地解决多线程间的同步问题,防止资源的竞争条件,确保特定的执行顺序。在这个示例中,通过巧妙地分配和释放信号量,实现了线程A、B、C按特定顺序打印字符,避免了可能的乱序输出。 5. **应用场景...
要在标准C++中使用多线程,可以使用类 thread,3条线程,我们可以直白一些,直接实现3个线程函数,在函数里面进行循环输出对应字符,每个循环控制10次即可;同时,要想控制输出顺序的话,最开始想到的方式是直接加一...
有三条线程,可以分别输出A、B、C字符,现想办法控制输出顺序,使得顺序为ABCABC......ABC[共10组],并且每条线程只能启动一次,不能多次启动。 需要3条线程输出不同的字符,分别为A、B、C,并且顺序要固定住:...
在给出的标题和描述中,提出了一个具体的问题:如何控制三个线程按照特定的顺序(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、...
在上述示例中,使用了 `Pattern.compile("[/]+")` 编译了一个正则表达式,用于匹配一个或多个斜杠 `/` 字符。然后使用 `split()` 方法将字符串按照 `/` 字符进行分割。通过修改 `split` 方法的第二个参数 `limit` 为...
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”被认为是一致的
这篇文档是关于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等数据结构中...
它由Abraham Lempel、Jacob Ziv和Stanley Welch于1977年提出,是LZW(Lempel-Ziv-Welch)算法的基础,但LZ77本身并不涉及编码过程,通常与霍夫曼编码或其他熵编码结合使用以生成可执行的压缩文件。LZ77的核心思想是...
sferfrefwefeqrfrefref