package com.sandking.test;
public class Test {
public static void main(String[] args) {
//定义一个公共的锁
Object lock = new Object();
//此处 logic1和logic2如果并发
logic1(lock);
logic2(lock);
}
public void logic1(Object lock){
//创建一个公共的Player对象
Player player = getById(1);
//这判断就会不准
if(player.getMoney()>100){
//比如送个送东西
logic4()
}
//创建十个线程,每个线程做money-100
for (int i = 0; i <10; i++) {
BuyThread thread = new BuyThread(lock, player);
thread.start();
}
}
public void logic2(Object lock){
//创建一个公共的Player对象
Player player = getById(1);
//这判断就会不准
if(player.getMoney()>100){
//比如送个送东西
logic3()
}
//创建十个线程,每个线程做money-100
for (int i = 0; i <10; i++) {
BuyThread thread = new BuyThread(lock, player);
thread.start();
}
}
public Player getById(int id){
//..省去...
return player;
}
}
class BuyThread extends Thread {
private Object lock;
private Player player;
public BuyThread(Object lock, Player player) {
super();
this.lock = lock;
this.player = player;
}
@Override
public void run() {
synchronized (lock) {
Long money = player.getMoney();
money = money - 10l;
player.setMoney(money);
System.out.println(player.getMoney());
}
}
}
class Player {
private Long money;
public Long getMoney() {
return money;
}
public void setMoney(Long money) {
this.money = money;
}
public Player(Long money) {
this.money = money;
}
}