多线程并发包学习总结(一)Lock锁

本文深入探讨了Java中Lock锁的使用场景与优势,包括如何避免线程无限期等待、提高读操作效率及灵活控制线程同步。通过具体示例展示了Lock与Condition结合使用的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么需要Lock锁
1.因为我们需要有一种机制可以不让等待的线程一直无期限地等待下去(比如只等待一定的时间或者能够响应中断),通过Lock就可以办到。
2.通过Lock可以知道线程有没有成功获取到锁
3.Lock锁相当于汽车中的手动挡,相比synchronized更加灵活,轻巧和方便。
4.Lock可以提高多个线程进行读操作的效率。
使用Lock和Condition来替代synchronized和wait(),nofity()来实现同步和进程通信,代码如下
lock锁的通用公式
Lock lock =new Lock();
Condition condition=new Condition
try{
lock.lock;上锁
if(flag){
try{
condition.await
}catch(){
}
}
业务逻辑处理
condition.single();
}catch(){

}finally
{
lock.unlock//释放锁
}

下面用一个具体的例子演示

package com.jerry.Thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


//共用资源
class Res {
    Lock lock=new ReentrantLock();
    public String username;
    public String userSex;
    public boolean flag=false;
}
//写入资源
  class Out extends Thread {
      Res res;
      Condition condition;//用来进程通信
      public Out(Res res,Condition condition) {
          this.condition=condition;
          this.res = res;
      }

      public void run() {
          int count = 0;

          while (true) {
              try{
              res.lock.lock();//开始上锁
             if(res.flag) {
                 try {
                     condition.await();//进程等待
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
             }
              if (count == 0) {
                  res.username = "jerry";
                  res.userSex = "boy";
              } else {
                  res.username = "sina";
                  res.userSex = "girl";
              }
              //求奇数偶数
              count = (count + 1) % 2;
              res.flag=true;
              condition.signal();//唤醒进程
          }catch (Exception ex){
                  ex.printStackTrace();
              }
              finally {
              res.lock.unlock();//释放锁
              }

          }

      }
  }
  //读入操作
      class Input extends Thread{
          Res res;
          Condition condition;
          public Input(Res res,Condition condition) {
              this.condition=condition;
              this.res = res;
          }
          public void run() {

              while(true){
                try {
                    res.lock.lock();
                    if (!res.flag){
                        try {
                            condition.await();//等待
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                    System.out.println(res.username+","+res.userSex);
                    res.flag=false;
                    condition.signal();//唤醒进程

                }catch (Exception ex){
                    ex.printStackTrace();
                }
                finally {
                    res.lock.unlock();
                }

            }

      }
}
       public class LockDemo{
           public static void main(String[] args) {
               Res res =new Res();
               Condition condition=res.lock.newCondition();
               Out out=new Out(res,condition);
               Input input=new Input(res,condition);
               out.start();
               input.start();
           }
       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值