lock 和condition条件变量的使用

注意点:1.作为对象锁,写在Account里面和外面不一样,写在里面是该类方法只会公用该类对象的锁,写在外面表示所有对象都公用那一个锁,不同用户公用一个锁,显然是不对的。所以写在里面表示每个用户的取钱和存钱共享锁,和其它的用户对象没有关系,因为公用的锁不一样。

2. 对于lock 锁一定注意不能用static 修饰,这样和写在Account 外面是一样的,其它的用户也可以调用另外一个用户的lock对象做为锁,影响到其它用户了,也会导致线程报错。

3. 对于百万用户同时存钱取钱的,用lock ,同步量少的用syncronized,这里测试的lock 为5.8秒,sy为7.3秒



@RequestMapping(value="/testMoney3",method=RequestMethod.GET)
@ResponseBody
public int testThread3() {
long time =System.currentTimeMillis();
int i=1000000;
int money=0;
while(i>2) {
MyAccount myAccount=new MyAccount();
new Thread() {
public void run() {
myAccount.saveMoney(m);
// System.out.println("baocun:"+myAccount.getMoney());
myAccount.delMoney(m);
// System.out.println("shanchu:"+myAccount.getMoney());
}
}.start();
i--;
money=myAccount.getMoney();
}
// int money=myAccount.getMoney();
// System.out.println(myAccount.getMoney());
long time2 =System.currentTimeMillis();
System.out.println("用时:"+(time2-time));
return money;
}


// @RequestMapping(value="/testMoneyOther",method=RequestMethod.GET)
// @ResponseBody
// public int testThread2() {
// int i=1000000;
// int money=0;

// long time =System.currentTimeMillis();

//               MyAccount myAccount=new MyAccount();    

// while(i>2) {
// myAccount.saveMoney(m);
// myAccount.delMoney(m);
// money=myAccount.getMoney();
// System.out.println(myAccount.getMoney());
// i--;
// }
// long time2 =System.currentTimeMillis();
// System.out.println("用时:"+(time2-time)/1000);
// return money;

// }

package com.example.demo.lockp;


import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


import org.springframework.stereotype.Component;




public class MyAccount {

  private int money =10000;


private  Lock lock = new ReentrantLock();
private  Condition condition = lock.newCondition();
private  Obj obj = new Obj();
   private boolean flage=true;


public int getMoney() {
return money;
}



public  Obj getObj() {
return obj;
}


public void saveMoney(int m) {
lock.lock();
try {
if(obj.getState()==1) {
money+=m;
obj.setState(2);
condition.signal();
}else if(obj.getState()==2){
condition.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}

   
public void delMoney(int m) {
lock.lock();
while(money<100&&money-m<0) {
flage=false;
}
if(!flage) {
try {
throw new Exception("ssss");
} catch (Exception e) {
e.printStackTrace();
}
}
try {
if(obj.getState()==2) {
money-=m;
obj.setState(1);
condition.signal();
}else if(obj.getState()==1){
condition.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}

// //设置参数
// public void setParm(Obj obj, Lock lock, Condition condition) {
// this.obj = obj;
// this.lock = lock;
// this.condition = condition;
// }



public void saveMoney123(int m) {
synchronized (this) {
money+=m;
notifyAll();
}
}


public void delMoney123(int m) {
synchronized (this) {
money-=m;
notifyAll();
}
}







}



package com.example.demo.lockp;


import org.springframework.stereotype.Component;


public class Obj {
public int state = 1;


public int getState() {
return state;
}


public void setState(int state) {
this.state = state;
}


}

猜你喜欢

转载自blog.csdn.net/qq_27988103/article/details/80066201