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;
}


}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
互斥量和条件变量是 C++ 中常用的同步机制,用于在多线程编程中控制共享资源的访问和线程间的通信。 互斥量(Mutex)用于保护共享资源,在访问共享资源之前需要获得互斥,访问完毕后需要释放互斥。具体使用方法如下: ```c++ #include <mutex> std::mutex mtx; // 定义互斥 // 在访问共享资源之前加 mtx.lock(); // 访问共享资源 // 在访问共享资源之后释放 mtx.unlock(); ``` 条件变量Condition variable)用于线程间的通信,一个线程可以通知另一个线程一些特定的事件已经发生。具体使用方法如下: ```c++ #include <condition_variable> #include <mutex> std::condition_variable cv; // 定义条件变量 std::mutex mtx; // 定义互斥 bool flag = false; // 条件变量依赖的标志变量 // 线程 1 std::unique_lock<std::mutex> lck(mtx); // 获得互斥 while(!flag) cv.wait(lck); // 等待条件变量 // 执行线程 1 的任务 // 线程 2 { std::lock_guard<std::mutex> guard(mtx); // 获得互斥 // 执行线程 2 的任务 flag = true; } cv.notify_one(); // 通知条件变量 ``` 在上述代码中,线程 1 获得互斥后,检查标志变量 `flag` 是否满足条件,如果不满足,则进入等待状态,并释放互斥;线程 2 在获得互斥后,设置标志变量 `flag` 为真,并通知条件变量 `cv`,线程 1 得到通知后重新检查标志变量,如果满足条件,则执行线程 1 的任务。 需要注意的是,在使用条件变量时,必须获得互斥,以避免竞态条件的发生。另外,条件变量使用通常需要和互斥一起使用,以确保线程安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值