java线程同步机制,多个指定的线程抢夺锁

 一个有关“线程抢夺锁”的简单问题

synchronized (写同一个对象)  意思是多线程都抢夺这{}代码块的东西(当然了要保证每个线程运行时括号里的对象是同一个对象)  保证多线程抢夺一个对象  一个代码块的运行权限!

 所谓 非公平锁就是一个线程抢夺到了锁 则后面几次也很可能也是这个线程抢到锁

而公平锁就是大家抢夺的几率一样大

(this)是个非公平锁,非公平锁运行截图: 

synchronized (this){
    //代码块...
}

题目中run()方法重写代码如下

    @Override
    public void run() {
        while(loop){
            synchronized (this){ //随便写一个同一个对象也行
                if(balance<1000){
                    System.out.println("余额不足,请充值!");
                }
                if(balance<=0){
                    loop = false;
//                    break;
                }else{
                    balance-=1000;
                    System.out.println(Thread.currentThread().getName()+"取出1000元,还剩"+balance+"元");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }


            }

        }
    }

 完整代码:

package com.xytedu.threaduse;

public class Homework02 {
    public static void main(String[] args) {
        BankCard bankCard = new BankCard();
        Thread user01 = new Thread(bankCard);
        Thread user02 = new Thread(bankCard);
        user01.start();
        user02.start();
    }
}

class BankCard implements Runnable{
    private int balance = 10000;
    private boolean loop = true;
    Integer temp = new Integer(1);
    @Override
    public void run() {
        while(loop){
            synchronized (this){ //随便写一个同一个对象也行
                if(balance<1000){
                    System.out.println("余额不足,请充值!");
                }
                if(balance<=0){
                    loop = false;
//                    break;
                }else{
                    balance-=1000;
                    System.out.println(Thread.currentThread().getName()+"取出1000元,还剩"+balance+"元");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }


            }

        }
    }

    public int getBalance() {
        return balance;
    }

    public void setBalance(int balance) {
        this.balance = balance;
    }

    public boolean isLoop() {
        return loop;
    }

    public void setLoop(boolean loop) {
        this.loop = loop;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值