一个有关“线程抢夺锁”的简单问题
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;
}
}