Java线程synchronized

一曲冷凌霜 提交于 2020-03-01 03:18:16

假设一台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();
        }
    }
}
View Code

代码块同步代码

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();
        }
    }
}
View Code

 

第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分钟

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!