首页 > 其他分享 >Lock锁并发原理

Lock锁并发原理

时间:2024-12-24 11:52:15浏览次数:2  
标签:int lock list private util 并发 Lock 原理 import

package com.wb.demo.util;

import com.graphbuilder.struc.LinkedList;

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

public class CommonLock<T> {
    final private LinkedList list = new LinkedList();
    final private int max = 10;
    private int count=0;
    private Lock lock = new ReentrantLock();
    private Condition producer = lock.newCondition();//本质是调用wait,notfiy时只有一个等待队列
    private Condition consumer = lock.newCondition();

    public void putEle(T t) {

        try {
            lock.lock();
            while (list.size() == max) {
                producer.await();//生产数量等于最大进行等待
            }
            list.addToHead(t);//小于最大数量增加,
            ++count;
            consumer.signalAll();//唤醒所有消费者去消费
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }

    }

    public T getEle() {
        T t = null;
        try {
            lock.lock();
            while (list.size() == 0) {
                consumer.await();//消费后数量为零,消费者进行等待
            }
            t = (T) list.removeTail();//有数据继续消费,
            count--;
            producer.signalAll();//通知生产者去生产
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }

        return t;
    }

    public static void main(String[] args) {
        CommonLock<String> commonLock =new CommonLock();
        for (int i = 0; i <10 ; i++) {
            new Thread(()->{
                for (int j = 0; j <5 ; j++) System.out.println(commonLock.getEle());
            },"consumer"+i).start();
        }
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        for (int i = 0; i < 2; i++) {
            new Thread(()-> {
                for (int j = 0; j <25 ; j++) commonLock.putEle(Thread.currentThread().getName()+"_"+j);
            },"produce"+i).start();
        }
    }
}

  

标签:int,lock,list,private,util,并发,Lock,原理,import
From: https://www.cnblogs.com/wangbiaohistory/p/18627111

相关文章

  • 并发编程相关
    相关面试题: 计算机组成 a=2+3 2,3从内存拿到cpu->计算->结果放到内存 操作系统管理线程的调度,os把app的线程指令扔到cpu调度策略,最常见的cfs 线程数不一定越多越好,线程切换  CAScompareandswap在JDK中的应用,原子类do{}while(!cas) ABA问题解决增......
  • 27. java反射的作用于原理
    1、定义:反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象,都能够调用它的任意一个方法。在java中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。2、哪里会用......
  • 【游戏设计原理】25 - 社会关系
    在游戏中融入并激活玩家的社会关系网络,能有效提升玩家的兴趣、参与度与满意度,并最终增强游戏黏性。一、原理分析与总结社交性在游戏中的重要性许多游戏都依赖玩家之间的互动(如棋盘、卡牌以及线上游戏),即便有单机游戏存在,更多更主流的玩法通常强调多人社交性。从“大杀四......
  • 薅羊毛的原理你知道吗?
    “薅羊毛”在互联网语境中,通常指的是利用一些优惠活动、漏洞或技巧,以低成本甚至零成本获取利益的行为。在前端开发的领域,虽然“薅羊毛”并不是一个专业术语,但我们可以从技术和用户行为的角度来探讨其可能的原理。技术原理:自动化脚本:使用JavaScript等前端脚本语言,编写自动化脚本......
  • 大语言模型驱动的Agent:定义、工作原理与应用
    文章目录引言什么是大语言模型?Agent的概念LLMAgent的工作原理Dify平台上的AgentLLMAgent的应用场景挑战与展望结论引言随着人工智能(AI)技术的发展,特别是自然语言处理(NLP)领域的进步,大语言模型(LLM,LargeLanguageModels)已经成为AI领域的一颗璀璨明星。这些模......
  • CountDownLatch底层原理、源码解析
    CountDownLatch通过AQS实现了基于计数器的同步机制。多个线程可以在计数值未达到0时进入等待状态,而其他线程可以通过调用countDown()减少计数值。当计数值减至0时,所有等待的线程会被唤醒并继续执行。下面只保留关键代码,解析见注释。CountDownLatch:publicclassCountDown......
  • 《计算机组成及汇编语言原理》阅读笔记:p48-p81
    《计算机组成及汇编语言原理》学习第4天,p48-p81总结,总计34页。一、技术总结1.CISCvsRISCp49,complexinstructionsetcomputingForexample,acomplexinstructionsetcomputing(CISC)chipmaybeabletomovealargeblockofdata,perhapsastringconsist......
  • 深入理解Spring容器:从基础到原理(四十一)
    深入理解Spring容器:从基础到原理(四十一)一、引言在我们对Spring容器中AOP实现的持续探索中,已经详细剖析了AnnotationAwareAspectJAutoProxyCreator在获取增强器过程中的buildAspectJAdvisors方法,了解了如何从Spring容器中扫描并提取AspectJ注解类的增强器。此刻,我们将深入......
  • 深入理解Spring容器:从基础到原理(四十)
    深入理解Spring容器:从基础到原理(四十)一、引言在我们对Spring容器中AOP实现的深入探索中,已经详细剖析了AnnotationAwareAspectJAutoProxyCreator在创建AOP代理过程中的基本流程,包括其在postProcessAfterInitialization方法中的代理创建逻辑以及获取增强器的初步步骤。此刻,......
  • 深入理解Spring容器:从基础到原理(三十九)
    深入理解Spring容器:从基础到原理(三十九)一、引言在我们对Spring容器功能扩展以及AOP实现的持续探索中,已经深入剖析了动态AOP自定义标签的解析过程,了解了Spring如何通过配置启用AOP并注册关键组件。此刻,我们将聚焦于AOP实现的核心环节——创建AOP代理。AnnotationAwareAspec......