假设一台5个人同时要上网
每个人上时间1~5分钟不等
加锁同步情况:排队上网,每个人都在自己的上网时间完毕后出来。
静态方法同步代码

class Person extends Thread{
private Random r = new Random();
private int Num;
public Person(int Num){
this.Num = Num;
}
public void run() {
toileting(Num, r.nextInt(4) + 1);
}
public static synchronized void toileting(int tNo2, int time){
for (int i = 0; i < time; i++) {
System.out.println("第" + tNo2 + "位, 上了" + i + "分钟");
}
}
}
public class SetTest01 {
public static void main(String[] args) {
//五个人
for (int i = 0; i < 4; i++) {
new Person(i).start();
}
}
}
代码块同步代码

class Person extends Thread{
private Random r = new Random();
private int Num;
public Person(int Num){
this.Num = Num;
}
public void run() {
synchronized (Person.class) {//此处锁可自定义定,但必须相同,用不同锁无效
for (int i = 0; i < Num; i++) {
System.out.println("第" + Num + "位, 上了" + i + "分钟");
}
}
}
}
public class SetTest01 {
public static void main(String[] args) {
//五个人
for (int i = 0; i < 4; i++) {
new Person(i).start();
}
}
}
第0位, 上了0分钟 第0位, 上了1分钟 第0位, 上了2分钟 第0位, 上了3分钟 第2位, 上了0分钟 第2位, 上了1分钟 第2位, 上了2分钟 第1位, 上了0分钟 第1位, 上了1分钟 第1位, 上了2分钟 第1位, 上了3分钟 第3位, 上了0分钟 第3位, 上了1分钟 第3位, 上了2分钟
未加锁不同步情况:一个人本来要连续上3分钟,结果上了1分钟就出来了。第二个人就进去了,本来要上连续5分钟,结果2分钟就出来了。。。直到结束
第1位, 上了0分钟 第3位, 上了0分钟 第0位, 上了0分钟 第2位, 上了0分钟 第0位, 上了1分钟 第3位, 上了1分钟 第0位, 上了2分钟 第2位, 上了1分钟 第0位, 上了3分钟 第3位, 上了2分钟
来源:https://www.cnblogs.com/ji84899/p/4950708.html
