Java线程synchronized

本文探讨了五人同时上网时采用排队与同步机制的问题,通过静态方法和代码块同步两种方式实现了时间上的有序分配。展示了不同同步策略下各人上网时间的变化,并对比了加锁与未加锁情况下输出的不同结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转载于:https://www.cnblogs.com/ji84899/p/4950708.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值