JVM 对 Java 的原生锁做了哪些优化?
为什么说 Synchronized 是非公平锁?
什么是锁消除和锁粗化?
有大佬能解释一下吗?
JVM 对 Java 的原生锁做了哪些优化?
为什么说 Synchronized 是非公平锁?
什么是锁消除和锁粗化?
有大佬能解释一下吗?
一个线程面试题中代码遇到的问题
三个人跑步,依次翻越障碍,必须3个人都翻阅一个时候,大家才能翻阅下一个。
我代码基本实现,但是有个问题。
import java.util.Random;
public class ThreadNumber {
//存有三个人跑的距离
public static class Num {
int m = 1;
int j = 1;
int g = 1;
}
/**
* 线程交替标识,true跑完了
*/
/**
* 打印奇数的线程类
*/
public static class Mming implements Runnable {
Num num;
//此段是否跑完
boolean flagM = false;
public Mming(Num num) {
this.num = num;
}
@Override
public void run() {
while (num.m <= 3) {
if ((!flagM)) {
System.out.println("m开始跑" + num.m + "个" + current());
int time = randomNum();
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Mming花了" + time + "跑完第" + num.m + "个" + current());
num.m++;
flagM = true;
//检查另外两人是否跑完
if (num.j >= num.m && num.g >= num.m) {
flagM = false;
}
} else {
if (num.j >= num.m && num.g >= num.m) {
flagM = false;
}
System.out.println("!!!!!!!");
}
}
}
}
/**
* 打印偶数的线程类
*/
public static class Jordan implements Runnable {
Num num;
boolean flagJ = false;
public Jordan(Num num) {
this.num = num;
}
@Override
public void run() {
while (num.j <= 3) {
if ((!flagJ)) {
System.out.println("j开始跑" + num.j + "个" + current());
int time = randomNum();
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Jordan花了" + time + "跑完第" + num.j + "个" + current());
num.j++;
flagJ = true;
if (num.m >= num.j && num.g >= num.j) {
flagJ = false;
}
} else {
if (num.m >= num.j && num.g >= num.j) {
flagJ = false;
}
System.out.println("!!!!!!!");
}
}
}
}
public static class Guai implements Runnable {
Num num;
boolean flagG = false;
public Guai(Num num) {
this.num = num;
}
@Override
public void run() {
while (num.g <= 3) {
if ((!flagG)) {
System.out.println("g开始跑" + num.g + "个" + current());
int time = randomNum();
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Guai花了" + time + "跑完第" + num.g + "个" + current());
num.g++;
flagG = true;
if (num.m >= num.g && num.j >= num.g) {
flagG = false;
}
} else {
if (num.m >= num.g && num.j >= num.g) {
flagG = false;
}
System.out.println("!!!!!!!");
}
}
}
}
volatile static Num num = new Num();
public static void main(String[] args) {
new Thread(new Guai(num)).start();
new Thread(new Mming(num)).start();
new Thread(new Jordan(num)).start();
}
public static int randomNum() {
Random rand = new Random();
return rand.nextInt(1000) + 1000;
}
public static String current() {
return Long.toString(System.currentTimeMillis());
}
}
这段代码执行可以,但是如果把 System.out.println("!!!!!!!");删除。执行就会卡死。完全搞不明白为什么!!!!!!!求助