java中的锁池和等待池

2023-10-29

在java中,每个对象都有两个池,锁(monitor)池和等待池

 

wait() ,notifyAll(),notify() 三个方法都是Object类中的方法.

 

锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。

 

等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池.

 

下面通过一个例子来说明:

 

要求写两个线程,一个线程将某个对象的某个成员变量的值加1,而另外一个线程将这个成员变量的值减1.使得该变量的值始终处于[0,2].初始值为0.

 

 

在java中,每个对象都有两个池,锁(monitor)池和等待池 wait() ,notifyAll(),notify() 三个方法都是Object类中的方法. 锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。 等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池. 下面通过一个例子来说明: 要求写两个线程,一个线程将某个对象的某个成员变量的值加1,而另外一个线程将这个成员变量的值减1.使得该变量的值始终处于[0,2].初始值为0. 
[java] view plain copy


package com.tju;  

class Target  

{  

    private int count;  

      

    public synchronized void increase()  

    {  

        if(count == 2)  

        {  

            try  

            {  

                wait();  

            }   

            catch (InterruptedException e)  

            {  

                e.printStackTrace();  

            }  

        }  

        count++;  

        System.out.println(Thread.currentThread().getName() + ":" + count);  

        notify();  

    }  

      

    public synchronized void decrease()  

    {  

        if(count == 0)  

        {  

            try  

            {  

                //等待,由于Decrease线程调用的该方法,  

                //所以Decrease线程进入对象t(main函数中实例化的)的等待池,并且释放对象t的锁  

                wait();//Object类的方法  

            }  

            catch (InterruptedException e)  

            {  

                e.printStackTrace();  

            }  

        }  

        count--;  

        System.out.println(Thread.currentThread().getName() + ":" + count);  

          

        //唤醒线程Increase,Increase线程从等待池到锁池  

        notify();  

    }  

}  

class Increase extends Thread  

{  

    private Target t;  

      

    public Increase(Target t)  

    {  

        this.t = t;  

    }  

    @Override  

    public void run()  

    {     

        for(int i = 0 ;i < 30; i++)  

        {  

            try  

            {  

                Thread.sleep((long)(Math.random()*500));  

            }  

            catch (InterruptedException e)  

            {  

                e.printStackTrace();  

            }  

              

            t.increase();  

        }  

          

    }  

      

}  

class Decrease extends Thread  

{  

      

    private Target t;  

    public Decrease(Target t)  

    {  

        this.t = t;  

    }  

      

    @Override  

    public void run()  

    {  

        for(int i = 0 ; i < 30 ; i++)  

        {  

            try  

            {  

                //随机睡眠0~500毫秒  

                //sleep方法的调用,不会释放对象t的锁  

                Thread.sleep((long)(Math.random()*500));  

            }  

            catch (InterruptedException e)  

            {  

                e.printStackTrace();  

            }  

              

            t.decrease();  

              

        }  

          

    }  

      

}  

  

public class Test  

{  

    public static void main(String[] args)  

    {  

        Target t = new Target();  

          

        Thread t1 = new Increase(t);  

        t1.setName("Increase");  

        Thread t2 = new Decrease(t);  

        t2.setName("Decrease");  

          

        t1.start();  

        t2.start();  

    }  

}  
 

 

https://blog.csdn.net/emailed/article/details/4689220

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中的锁池和等待池 的相关文章

  • ESP_C3在ubuntu下运行RT-Thread

    1 clone源代码RT Thread git clone git 64 github com RT Thread rt thread git 2 开始搭建ESP IDF环境 进入源码到bsp文件夹下找到ESP32 C3 xff0c 开始配
  • 自动化测试实现多线程

    自动化测试实现多线程 进程 进程就是一个程序在一个数据集上的一次动态执行过程 我们编写的程序用来描述进程要完成哪些功能以及如何完成 线程 线程页脚轻量级进程 他是一个基本的CPU执行单元 是进程中的实现 线程的出现是为了降低上下文切换的小号
  • 无线传感网WSN

    第一章 绪论 WSN定义 无线传感网络是由大量的静止或移动的传感器以自组织和多跳的方式构成的无线网络 WSN系统组成 传感器节点 汇聚节点和管理节点 WSN的三个基本要素 传感器 感知对象 用户 观测者 WSN特点 1 自组织性 2 以数据
  • 线程池创建类ThreadPoolExecutor介绍

    ThreadPoolExecutor 使用给定的初始参数和默认线程工厂和拒绝的执行处理程序创建一个新的线程池执行器 一 构造方法参数说明 有四个构造方法 最终都是调用构造方法四 构造方法参数说明 param corePoolSize 保留在
  • Android的消息处理机制(图+源码分析)——Looper,Handler,Message

    百度二面的时候 觉得自己源码分析太差 没有深入 面试官估计觉得我很不爽 恩 来吧 自己结合这篇文章 基本上把android消息机制给弄清楚了 http www androidzz com 2011 09 android looper han
  • java中的锁池和等待池

    在java中 每个对象都有两个池 锁 monitor 池和等待池 wait notifyAll notify 三个方法都是Object类中的方法 锁池 假设线程A已经拥有了某个对象 注意 不是类 的锁 而其它的线程想要调用这个对象的某个sy
  • yield和join方法的使用。

    join方法用线程对象调用 如果在一个线程A中调用另一个线程B的join方法 线程A将会等待线程B执行完毕后再执行 yield可以直接用Thread类调用 yield让出CPU执行权给同等级的线程 如果没有相同级别的线程在等待CPU的执行权
  • CreateEvent人工重置事件对象

    include
  • 0.net-跨线程使用CSocket

    CSocket断言错误 ASSERT pState gt m hSocketWindow NULL 起因 在套接字处于连接或者发送状态时 试图关闭套接字 于是在这个断言语句处发生中断 原因分析 微软官方解释如下 http support m
  • 线程进程协程的实现代码

    单线程 import time def run print hello world time sleep 1 if name main for i in range 5 run 多线程 import threading import tim
  • 关于CoInitialize()

    在msdn中对于CoInitialize的解释如下 Initializes the COM library on the current apartment and identifies the concurrency model as s
  • 分析Java线程池执行原理

    Java并发编程源码分析系列 分析Java线程池的创建 上一篇已经对线程池的创建进行了分析 了解线程池既有预设的模板 也提供多种参数支撑灵活的定制 本文将会围绕线程池的生命周期 分析线程池执行任务的过程 线程池状态 首先认识两个贯穿线程池代
  • wxWidgets开发之多线程wxThread编程

    上节说到使用wxCondition来实现某一消息处理的业务场景的多线程处理方法 在此之前先分享一下wxCondition用法 条件变量 最常用在多线程环境下 用来指示当前所在线程的某些条件已经满足 其他线程可以共享该线程的数据 或者去完成预
  • Qt中的线程详解

    概述 在多核时代 CPU 的主频已经进入瓶 颈 另辟蹊径地提高程序运行效率就是使用线程 充分利用多核的优势 线程可以看做是 轻量级进程 线程即可以由操作系统管理 也可以由应用程序管 1 为什么要使用线程 我们都知道 进程线程的概念是非常重要
  • c++11std::thread扩展

    最近 整理一下学习c 的文章 看到一篇文章 其中提到了thread local和std future 觉得这两东西很有趣 于是网上搜了一些资料 觉得很有帮助 希望可以对大家学习c 线程有所帮助 http www cnblogs com ha
  • surfaceDestroyed什么时候被调用

    今天看别人的代码 突然有个疑问 surfaceDestroyed这个函数什么时候被调用呢 上网搜了一番 基本都说是surface被销毁的时候 才会调用surfaceDestroyed 问题又来了surface什么时候被销毁呢 大家都知道su
  • python 图片、文件 通过 request header 多线程下载

    写爬虫过程中发现图片下载比较慢 遂使用多线程下载来提速 import threading import requests class MulThreadDownload threading Thread def init self url
  • Java线程的5种状态及状态之间转换

    Java中的线程的生命周期大体可分为5种状态 1 新建 NEW 新创建了一个线程对象 2 可运行 RUNNABLE 线程对象创建后 其他线程 比如main线程 调用了该对象的start 方法 该状态的线程位于可运行线程池中 等待被线程调度选
  • 无线传感网必知必会

    一 填空题 传感器网络三大基本要素 传感器 感知对象 用户 观测者 传感器节点的基本功能模块包括 数据采集模块 数据处理和控制模块 通信模块 供电模块 四个 其中 通信模块 能量消耗最大 传感器节点通信模块的工作模式有 发送 接收 空闲 睡
  • Java线程(Thread)生命周期的6种状态

    当线程被创建并启动以后 它既不是一启动就进入了执行状态 也不是一直处于执行状态 在线程的生命周期中 可能处于不同的状态 java lang Thread State 列举出了这6种线程状态 线程状态 导致状态发生条件 New 新建 线程刚被

随机推荐

  • js 搜索关键字高亮

    主要是通过replace方法实现的 实现代码
  • SSTI 学习笔记

    PHP SSTI Twig 学习文章 进入环境 左上角有flag hint 都检查看看 flag页面显示ip hint页面源代码有提示 考虑XFF头或者referer头 测试一下 注 这里不用加上 出来了 python flask ssti
  • 30岁之后想转行,可行吗?这20条建议让你少走弯路!

    都说三十而立 可眼看着到了意气风发的年龄 却突然意识到自己仍一事无成 甚至连养活自己都是问题 30多岁 大多数人还要开始买房 买车 结婚生子 养家糊口 于是各种压力逼迫之下 就想到了转行 期望可以通过转行实现 财务自由 不过 俗话说 隔行如
  • 函数strlen的使用

    函数strlen是C语言的提供的函数 它包含在 include
  • Linux命令_printf & 格式化输出信息

    目录 1 语法 1 1 格式化参数 1 2 转义符参数 2 常见用法 2 1 输出字符串 2 2 格式化输出 2 3 设置格式对齐 2 4 控制输出宽度 2 5 替换补全字符 3 设置颜色 3 1 参数选项 3 2 基本用法 3 3 设置文
  • java选择排序(Selection Sort)——详解讲解+案例+时间复杂度

    文章目录 需求 排序原理 案例 选择排序的时间复杂度分析 需求 排序前 4 6 8 7 9 2 10 1 排序后 1 2 4 5 7 8 9 10 排序原理 1 每一次遍历的过程中 都假定第一个索引处的元素是最小值 和其他索引处的值依次进行
  • 剑指 Offer 16. 数值的整数次方 -- 快速幂

    0 题目描述 leetcode原题 剑指 Offer 16 数值的整数次方 1 快速幂解法 快速幂实际上是二分思想的一种应用 二分推导 x n x n
  • Windows下安装DVWA靶场

    Windows下利用phpstudy安装DVWA靶场 1 下载安装phpstudy以及DVWA Master php study下载官网https www xp cn DVWA资源已上传 在这里插入图片描述 https img blog c
  • SpringBoot整合shiro-spring-boot-starter

    1 项目启动时报错如下 Description The bean securityManager defined in class path resource org apache shiro spring config web autoc
  • Vue中el-input的相关校验使用场景

    1 输入框只能输入数字且第一位不能为小数点 以及只能输入小数点后两位
  • .NET Core微服务之路:利用DotNetty实现一个简单的通信过程

    上一篇我们已经全面的介绍过 基于gRPC服务发现与服务治理的方案 我们先复习一下RPC的调用过程 笔者会在这一节的几篇文章中反复的强调这个过程调用方案 看下图 根据上面图 服务化原理可以分为3步 服务端启动并且向注册中心发送服务信息 注册中
  • 人工智能、大数据、物联网、区块链,四大新科技PK,你更看好谁?

    最近行业中备受关注并且非常火热的产业有哪些呢 小编这边总结了一下 一共有4个 分别是人工智能 大数据 物联网和区块链 这四种新科技也一直是蓄势待发 未来将引领新一代的科技成长 也会带给人类很多更方便快捷的生活 说到这里 可能好多小伙伴对这些
  • Python使用Selenium打开百度并指定搜索

    from selenium import webdriver from selenium webdriver common keys import Keys from selenium webdriver common by import
  • (全网最详细攻略)【Crypto++】在Visual studio2022中运行Cryptopp

    文章目录 前言 一 Cryptopp是什么 1 Cryptopp CRYPTO 官方文档wiki 二 下载Cryptopp 2 Crypto 下载地址 3 下载PEM包 三 在VS2022中使用Cryptopp库 4 处理crypto 源文
  • mapboxgl 绘制3d polygon

  • “人机”既不是人也不是机

    人机 实际上是一个独特的实体 既不是传统意义上的人 也不是简单的机器 这个术语通常用来描述人与机器之间的协同关系 特指人类与人工智能技术的融合 人机 可以是指通过人工智能技术进行增强和扩展的人类能力 例如 人们可以使用智能手机 计算机和其他
  • 以太网概述

    各种网络的区别 以太网 是一种实现局域网通信的技术标准 是目前最广泛的局域网技术 以太网可以用在局域网 广域网 也可以用在互联网上 因为简单易用 现在网络有以太网化的趋势 局域网 是一个局部范围的计算计组 就是局部地区形成的一个区域网络 特
  • Kubernetes入门

    Kubernetes入门 一 Kubernetes是什么 首先 它是一个全新的基于容器技术的分布式架构领先方案 这个方案虽然还很新 但是它是谷歌十几年依赖大规模应用容器技术的经验积累和升华的一个重要成果 实现资源管理的自动化 以及跨多个数据
  • PyCharm配置解释器

    文章目录 一 Python解释器 Python Interpreter 是什么 二 添加解释器的步骤 1 单击 Settings 2 倒三角 点击 Show All 3 点击 4 点击 Existing environment 5 选中 p
  • java中的锁池和等待池

    在java中 每个对象都有两个池 锁 monitor 池和等待池 wait notifyAll notify 三个方法都是Object类中的方法 锁池 假设线程A已经拥有了某个对象 注意 不是类 的锁 而其它的线程想要调用这个对象的某个sy