Thread 和synchronized以及 sleep

按理说在synchronized使用sleep方法,该线程应该不会释放锁,可是如果是执行时间+休眠时间过长的话,超过了cup的时间片的时间,这个时候,这个线程便会被其他线程所竞争。自己在写代码的时候发现了这个问题,然后从网上了解了一下,大概是这个问题。应该是操作系统的操作
以下是代码:
首先是锁对象
下面展示一些 内联代码片

package com.cn;

public class Obj {
    public int count=1;
}

线程a

package com.cn;

public class Theada implements Runnable {
    private Obj ss;

    public Theada(Obj ss) {
        this.ss = ss;
    }

    @Override

    public void run() {
        while (true){
            synchronized (ss){
                System.out.println("a:"+ss.count);
                ss.count++;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (ss.count>10){
                    System.exit(0);
                }


            }
        }
    }
}
;

线程b

package com.cn;

public class Theadb implements Runnable {
    private Obj ss;

    public Theadb(Obj ss) {
        this.ss = ss;
    }

    @Override
    public void run() {
        while (true){
            synchronized (ss){
                System.out.println("b:"+ss.count);
                ss.count++;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (ss.count>10){
                    System.exit(0);
                }

            }
        }
    }
}

main方法

package com.cn;

public class Test {
    public static void main(String[] args) {
        Obj obj=new Obj();
        Theada theada=new Theada(obj);
        Theadb theadb=new Theadb(obj);
        Thread thread=new Thread(theada);
        Thread threadb=new Thread(theadb);
        thread.start();
        threadb.start();
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值