1、使用volatile关键字修饰 当前index。
public class Main1 {
volatile int x = 0;
String string="thefreedom";
Main1() {
new Thread(() -> {
while (x < string.length()) {
while (x % 2 == 0) ;
if(x<string.length()){
System.out.println(Thread.currentThread().getName()+"_"+string.charAt(x));
}
x++;
}
}).start();
new Thread(() -> {
while (x < string.length()) {
while (x % 2 == 1) ;
if(x<string.length()){
System.out.println(Thread.currentThread().getName()+"_"+string.charAt(x));
}
x++;
}
}).start();
}
2、使用synchronized、wait/notifiy机制。
public class ThreadSynchronized {
private static String str = "我爱北京天安门";
private static int index;
private static boolean flag = true;
static class A implements Runnable{
@Override public void run() {
synchronized (str){
while(index < str.length()){
if(flag) {
System.out.println(Thread.currentThread() +":"+ str.charAt(index));
index++;
flag = false;
str.notify();
} else {
try {
str.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
static class B implements Runnable{
@Override public void run() {
synchronized (str){
while(index < str.length()){
if(!flag) {
System.out.println(Thread.currentThread() +":"+ str.charAt(index));
index++;
flag = true;
str.notify();
} else {
try {
str.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public static void main(String[] args) {
new Thread(new A()).start();
new Thread(new B()).start();
}
}