synchronized的用法,和怎么测一个线检程是否拥有锁

会上树的猪 2019-04-18 09:15:01
从来没写过这类的文章,不知道怎么解释,但是在程序里面都有注释,免去了我的尴尬。不说了,直接上代码。

/**
* 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;
}
}
...全文
120 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧