今天看到这么一道多线程题:有三个线程,每个线程有一个属性flag,假设每个线程的flag值顺序为“A”、“B”、“C”,编写一段代码在控制台顺序输出“ABCABC”。
因为线程执行不是按顺序执行的,如果需要按顺序执行,则需要加锁。现在设想有一个对象“lock”作为这三个线程共用的锁,“lock”控制每个线程的“输出flag值到控制台”的代码。每个线程在start后,都需要去检查是否获得了”lock“的锁(锁的分配是都虚拟机分配的,貌似),如果获得了锁,则执行相关代码,如果没有获得锁,则挂起,等待系统下次调用。
示例代码
synchronized关键字就是为”lock“对象加锁。加上synchronized关键字后,每次只能有一个线程调用被加锁的代码段(变量,方法)。
因为线程执行不是按顺序执行的,如果需要按顺序执行,则需要加锁。现在设想有一个对象“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关键字后,每次只能有一个线程调用被加锁的代码段(变量,方法)。