从来没写过这类的文章,不知道怎么解释,但是在程序里面都有注释,免去了我的尴尬。不说了,直接上代码。
/**
* synchronized的用法,和测试对象是否拿到了锁
* @author QPF
*
*/
public class SynTest {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
SynTest st = new SynTest();
st.startTest();
}
public void startTest() throws InterruptedException{
//创建多个用户对象
User u1 = new User();
u1.setName("qpf");
User u2 = new User();
u2.setName("zhangsan");
//创建一个商品对象
Commodity c = new Commodity();
c.setAmount(10);
//启动线程
new SynThread(u1,c).start();
new SynThread(u2,c).start();
}
/**
* 购买的方法,默认为一个用户只能买一件
* @param user
* @param c
* @throws InterruptedException
*/
public void buyCommodity(User u,Commodity c) throws InterruptedException{
//需要锁定商品这个对象,不让其他人购买,以免商品的数量对不上
synchronized (c) {
System.out.println(u.getName() + "进入购买过程,需要锁定商品。");
//测试用户是否获得了锁
System.out.println(u.getName() + "是否获得了锁 : " + Thread.holdsLock(c));
int ba = c.getAmount();
//先输出购买前的数量
System.out.println("商品购买前的数量:" + ba);
//修改商品的数量
ba--;
c.setAmount(ba);
//输出购买后的数量
System.out.println("商品购买后的数量:" + c.getAmount());
Thread.sleep(2000);
System.out.println(u.getName() + "购买完成,退出同步块--------------------");
}
}
}
class SynThread extends Thread{
private User user;
private Commodity commodity;
public SynThread(User u,Commodity c){
this.user = u;
this.commodity = c;
}
@Override
public void run() {
try {
new SynTest().buyCommodity(user,commodity);
} catch (InterruptedException e) {
}
}
}
/**
* 创建一个商品对象,用于测试synchronized的使用效果
* @author QPF
*
*/
class Commodity{
private int amount;
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
}
/**
* 创建一个用户对象,模拟多个用户选购商品
* @author QPF
*
*/
class User{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}