假设一台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分钟