java中线程同步块的代码
/*
* 取钱线程安全
*/
public class SynBlockTest01 {
public static void main(String[] args) {
//账户
Account account=new Account(1000,"结婚礼金");
SynDrawing you=new SynDrawing(account,80,"可悲的你");
SynDrawing wife=new SynDrawing(account,90,"happy的她");
you.start();
wife.start();
}
}
//模拟取款
class SynDrawing extends Thread{
Account account;//取钱的账户
int drawingMoney;//取的钱数
int packetTotal;//口袋的钱
public SynDrawing(Account account, int drawingMoney,String name) {
super(name);
this.account = account;
this.drawingMoney = drawingMoney;
}
@Override
public void run() {
test();
}
//目标锁定account
public void test() {
//提高性能
if(account.money<=0) {
return;
}
synchronized(account) {
if(account.money-drawingMoney<0) {
return;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
account.money-=drawingMoney;
packetTotal+=drawingMoney;
System.out.println(this.getName()+"-->账户余额为:"+account.money);
System.out.println(this.getName()+"-->口袋的钱为:"+packetTotal);
}
}
}
package cn.jd.syn;
import java.util.ArrayList;
import java.util.List;
/*
* 取钱线程不安全
* 操作容器
*/
public class SynBlockTest02 {
public static void main(String[] args) throws InterruptedException {
List<String> list=new ArrayList<String>();
for(int i=0;i<10000;i++) {
new Thread(()->{
//同步块
synchronized(list) {
list.add(Thread.currentThread().getName());
}
}).start();
}
//让主线程延时1秒,害怕线程没有运行完成,主线程就执行完毕了
Thread.sleep(1000);
System.out.println(list.size()); //发现有些数据丢掉了,显然是被覆盖了
}
}