JavaSE-多线程(2.1)- 锁举例1(synchronized)

JavaSE多线程 编写一个类,直接继承java. lang. Thread,重写run方法。 阅读详情

JavaSE-多线程(2.1)- 锁举例1(synchronized)

package com.hs.example.base.multithread.day01;

import java.util.LinkedList;

/**
 * 自定义容器,固定容量最大值为MAX_COUNT,运行多线程并发put和get
 * @param <T>
 */
public class SynchronizedTest4<T> {

    final LinkedList<T> lists = new LinkedList<>();
    final int MAX_COUNT = 10;
    private int count = 0;

    /**
     * 加锁,防止count与实际lists大小不一致
     *
     * @param t
     */
    public synchronized void put(T t) {
        System.out.println(Thread.currentThread().getName() + " put start...");
        /**
         * 这里为什么用 while 不用if,
         * 比如当前wait线程是a,线程c执行get方法后唤醒a线程,此时 lists.size() = MAX_COUNT -1 
         * a需要重新获取锁,此时线程b也执行put方法,也需要获取锁
         * 如果线程b获取锁成功,那么 lists.size() = MAX_COUNT 
         * 此时a获取锁成功,继续执行,如果不判断 lists.size() == MAX_COUNT
         * 会导致 lists.size() 超出范围
         */
        while (lists.size() == MAX_COUNT) {
            try {
                System.out.println(Thread.currentThread().getName() + " waiting...");
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        lists.add(t);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        count++;
        this.notifyAll();
        System.out.println(Thread.currentThread().getName() + " put end...");
    }

    public synchronized T get() {
        System.out.println(Thread.currentThread().getName() + " get start...");
        T t = null;
        while (lists.size() == 0) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        t = lists.removeFirst();
        count--;
        this.notifyAll();
        System.out.println(Thread.currentThread().getName() + " get end...");
        return t;
    }

    public static void main(String[] args) {
        SynchronizedTest4 synchronizedTest4 = new SynchronizedTest4();
        for (int i = 0; i < 20; i++) {
            Thread t = new Thread(() -> {
                synchronizedTest4.put("str");
            }, "put thread" + i);
            t.start();
        }

        for (int i = 0; i < 20; i++) {
            Thread t = new Thread(() -> {
                synchronizedTest4.get();
            }, "get thread" + i);
            t.start();
        }
    }
}

put thread0 put start...
put thread0 put end...
get thread5 get start...
get thread5 get end...
get thread18 get start...
get thread19 get start...
get thread15 get start...
get thread11 get start...
get thread17 get start...
get thread10 get start...
get thread16 get start...
get thread13 get start...
get thread12 get start...
get thread9 get start...
get thread8 get start...
get thread4 get start...
get thread14 get start...
get thread7 get start...
get thread6 get start...
get thread0 get start...
get thread3 get start...
get thread1 get start...
get thread2 get start...
put thread19 put start...
put thread19 put end...
put thread18 put start...
put thread18 put end...
put thread15 put start...
put thread15 put end...
put thread14 put start...
put thread14 put end...
put thread9 put start...
put thread9 put end...
put thread16 put start...
put thread16 put end...
put thread13 put start...
put thread13 put end...
put thread12 put start...
put thread12 put end...
put thread11 put start...
put thread11 put end...
put thread10 put start...
put thread10 put end...
put thread17 put start...
put thread17 waiting...
put thread7 put start...
put thread7 waiting...
put thread6 put start...
put thread6 waiting...
put thread8 put start...
put thread8 waiting...
put thread3 put start...
put thread3 waiting...
put thread5 put start...
put thread5 waiting...
put thread4 put start...
put thread4 waiting...
put thread2 put start...
put thread2 waiting...
put thread1 put start...
put thread1 waiting...
get thread2 get end...
get thread1 get end...
get thread3 get end...
get thread0 get end...
get thread6 get end...
get thread7 get end...
get thread14 get end...
get thread4 get end...
get thread8 get end...
get thread9 get end...
put thread1 put end...
put thread2 put end...
put thread4 put end...
put thread5 put end...
put thread3 put end...
put thread8 put end...
put thread6 put end...
put thread7 put end...
put thread17 put end...
get thread18 get end...
get thread19 get end...
get thread15 get end...
get thread11 get end...
get thread17 get end...
get thread10 get end...
get thread16 get end...
get thread13 get end...
get thread12 get end...
Tushare Pro的安装使用——“抱歉,您没有访问该接口的权限,权限的具体详情访问:https://tushare.pro/document/1?doc_id=108”问题 最近做毕设关于量化交易的, 因此一直使用tushare作数据源,但是过程中到一些问题,因此这里写篇文章,供大家一起交流下。 Tushare简介 Tushare是一个免费、开源的python财经数据接口包。拥有如股票、基金、期货等行情数据,公司财务、基金经理等基本面数据,以及债券、外汇、行业、大数据、区块链。Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,因此非常方便... 阅读详情

相关推荐

音视频开发—H264相关概念和压缩原理详解(GOP、宏块、帧内压缩、帧间压缩)

本文讲述了H264相关概念和原理——GOP概念,SPS与PPS,帧内压缩原理,帧间压缩原理,解释了什么是运动补偿,什么运动矢量等等概念

weixin_46999174的博客 3979

【JavaSE】【多线程】synchronized和死锁

synchronized的语法,互斥,可重入; 死锁的成因与避免方案

yj20040627的博客 4243

Claude Code插件安装与VSCode深度集成实战指南

Claude Code是一款专为IDE设计的AI编程助手插件,其核心价值在于将自然语言意图转化为可运行代码,从而优化开发者认知带宽分配。它依赖Node.js运行时、git版本上下文和VSCode编辑器API三者协同工作,技术原理涉及本地进程通信、权限策略绕过、上下文感知补全等关键机制。该工具显著提升工程效率,适用于CLI开发、EXIF元数据处理、异步逻辑生成等典型JavaScript/TypeScript应用场景。本文聚焦Claude Code插件在VSCode中的真实落地链路,覆盖Windows/macO

weixin_34006468的博客 475

Java之Synchronized与锁升级

锁升级的过程锁升级后,hashcode去哪儿了?● 各种锁优缺点、synchronized锁升级和实现原理。

qq_62592925的博客 1358

使用OpenCV进行3D重建:详细指南

3D重建是计算机视觉领域的一项关键技术,它能够从二维图像中恢复出场景的三维结构。这项技术在机器人视觉、增强现实和3D建模等多个领域都有广泛的应用。在本篇技术博客中,我们将详细介绍如何使用OpenCV这一流行的计算机视觉库来实现3D重建。我们将逐步探讨整个过程,包括相机标定、特征点提取与匹配、立体校正、深度图计算以及最终的三维重建。3D重建是一个复杂的过程,涉及多个步骤和多种算法。OpenCV提供了强大的工具来支持这一过程,从相机标定到特征点提取与匹配,再到立体校正和深度图计算,最后实现三维重建。

weixin_41544125的博客 1317

Trae编程工具Cline插件深度集成与Claude 3.7 API Key高级配置实战

本文详细介绍了如何在Trae编程工具中深度集成Cline插件并配置Claude 3.7 API Key的高级技巧。通过实战案例,展示了如何提升代码补全质量、实现多轮对话记忆及自定义代理设置,特别适合全栈工程师和需要私有化AI服务的团队。文章还涵盖了安装流程、API Key获取方式及企业级部署的最佳实践。

weixin_28829903的博客 436

【JavaSE】【多线程】进阶知识

锁策略,synchronized特性,CAS,JUC组件

yj20040627的博客 4955

MFC工具栏增加EditBox和Button

1. 在资源视图中增加EditBox, Button控件,ID分别为ID_EDIT_SEED, ID_BTN_SEED 2. 在CMainFrame中增加成员变量 CMFCToolBarEditBoxButton *m_editSeed; CMFCToolBarButton *m_btnSeed; 3. 在CMainFrame::OnCreate中创建控件 m_editSeed = new CMFCToolBarEditBoxButton(ID_EDIT_SEED, GetCmdMgr()-&.

学习是为了探索这个世界的本质 803

synchronized无锁、偏向锁、轻量级锁、重量级锁

synchronized详解

qq_44300280的博客 2775

c#视觉应用开发中如何使用Emgu CV在C#中进行图像处理?

Emgu CV 是 OpenCV 的 .NET 包装器,可以让开发者在 .NET 语言(如 C#)中使用 OpenCV 的功能进行图像处理。在进行图像处理时,Emgu CV 提供了丰富的 API 可以使用。PictureBoxImageBox下面是一个详细的示例,演示如何使用 Emgu CV 在 C# 中进行基本的图像处理,包括加载图像、转换为灰度图像、进行边缘检测,然后显示结果。byte在这个示例中,我们使用了三个PictureBox控件来显示原始图像、灰度图像和边缘检测后的图像。

zhangzhechun的专栏 670

大唐杯5G考前冲刺篇(回顾全文重点必看)

大唐杯习题复习指南

nimo观察者 1万+

Synchronized 锁升级原理分析

本文介绍了Java中的synchronize关键字的底层实现机制。通过分析锁的获取和释放过程、内置锁和监视器的关系以及锁优化技术,深入解析了synchronize在多线程环境中的工作原理。

Ezrealwj的博客 1178

华为OD机试真题 新系统2026-04-01 Python&JS 实现【空间占用计算】

员工A的磁盘空间经常被耗尽,他需要找到占用空间最大的目录或文件,然后决定如何清理文件释放空间。给定某一目录,请编写程序帮助他统计该目录内一级子目录和文件的占用空间,并返回目标目录一级子项(文件或子目录)中占用空间最大的项。

MISAYAONE的博客 1306

Synchronized(1) - 偏向锁

Synchronized(1) - 偏向锁 在多线程并发编程中,synchronized一直扮演重要的角色,在JAVA SE 1.6版本之前被称为重量级锁。在JAVA SE 1.6中synchronized得到了优化,为了减少锁和释放锁带来的性能消耗而引入了偏向锁和轻量级锁。本文重点介绍偏向锁的实现。 1 synchronized实现原理与使用 利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现为以下三种形式。 对于普通同步方法,锁是当前实例对象

八荒六合唯我独尊 566

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JavaSE基础知识-多线程-synchronized类锁

在多线程编程中,当多个线程操作静态资源(静态变量、静态方法)时,普通的 “对象锁”(保护实例资源)往往无能为力。这时需要 “类锁” 登场 —— 它是针对类级别资源的同步机制,能保证静态资源的线程安全。

2503_91308956的博客 781

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JavaSE后阶(多线程)

Java多线程

2401_85776998的博客 1078

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【并发编程系列2】synchronized锁升级原理分析(偏向锁-轻量级锁-重量级锁)

这样,等真的沉下心来学习,不至于被找资料分散了心神。另外,给大家安排了一波学习面试资料:以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!这样,等真的沉下心来学习,不至于被找资料分散了心神。另外,给大家安排了一波学习面试资料:[外链图片转存中…(img-C5NHr9u5-1712729837496)]

Y1567409的博客 351

synchronized锁升级

在 Java SE 1.6中,锁一共有4种状态级别从低到高依次是:无锁状态、偏向锁状态轻量级锁状 态和重量级锁状态这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。

m0_62639288的博客 360

【JavaSE】多线程之synchronized相关情况

前一篇文章中我们了解了几种常见的锁策略,这里我们来着重介绍一下synchronized的相关情况。

stillaliveQEJ的博客 297

锁的实现原理—3,Synchronized实现理解

文章目录java语言、Java虚拟机规范—官方文档Synchronized概述:用法、作用对象锁代码测试Java 代码编译代码测试结果分析为何如此实现的猜测类锁代码测试Java代码编译代码测试结果分析为何如此实现的猜测优缺点优点缺点 java语言、Java虚拟机规范—官方文档 https://docs.oracle.com/javase/specs/index.html 如果我英文词汇量多年没增,那一定是我没有学技术。如果我学技术了,那就不要say hello。 Synchronized概述:用法、作用

该怎么解释?我懒得解释 1085

Java多线程学习(二)synchronized关键字(1)

(1) synchronized同步方法 思维导图: 一 简介 Java并发编程这个领域中synchronized关键字一直都是元老级的角色,很久之前很多人都会称它为“重量级锁”。但是,在JavaSE 1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后变得在某些情况下并不是那么重了。 二 变量安全性 “非线程安全”问题存在于“实例变量”中,如...

weixin_39940206的博客 229

【JavaSE】Lock锁和synchronized锁的比较,lock锁的特性,读写锁的实现。

一、为什么出现了Lock锁 出现lock锁肯定是由于synchronized锁有一些缺陷,下面说一下具体缺陷: 1. 不提供中断锁 synchronized锁有两种情况会释放锁: ①.代码块或者方法执行完毕,自动释放锁 ②.在执行代码块或者方法过程中发生异常,自动释放锁. 那么如果在执行过程中要等待IO或者其他原因被阻塞了,但是又没有其他方法释放锁,其他线程只能继续等待,这是非常影响程序效率的。 ...

qq_39487033的博客 380

synchronized的实现原理与应用

在多线程并发中synchronized一直存在,很多人把它称为重量级锁,但随着JavaSE1.6对sycnhronized进行了各种优化后,有些情况就不再那么重了。接下来详解一下JavaSE 1.6为了减少获得锁和释放锁带来的性能消耗并引入了偏向锁和轻量级锁,以及锁的存储结构和升级过程利用synchronized实现同步的基础:Java中每一个对象都可以作为锁。。

m0_62645012的博客 1149

Synchronized锁与ReentrantLock锁

Synchronized是Java语言层面提供的语法,所以我们不需要考虑异常,而ReentrantLock是JavaSE核心类库的并发包给我们提供的的可重入锁,所以,在编程过程中,我们就必须先创建锁,结束后在finally中正确释放锁。2.父类中synchronized修饰的方法,如果子类没有重写,,则该方法仍然是线程安全的;1.当一个线程访问对象的一个synchronized(this)同步代码块时,另一线程仍然可以访问该对象中的非synchronized(this)同步代码块。以及锁的作用是什么?

m0_54362791的博客 229

JavaSE——多线程中lock和synchronized的区别

在多线程中,为了使线程安全,我们经常会使用synchronized和Lock进行代码同步和加锁。

Demon_and_Angle_的博客 197

【JAVASE】多线程编程基础

????:博客首页: 进击的波吉 ????:今日分享的文章: 【JAVASE】多线程编程基础 ????:希望自己对源码的解读的可以帮助到大家???? ????:Boji 还在努力学JavaSE ,如有疑问、疏漏之处,请多多指点???? ☀️:自学成长的路上,感谢大家相伴!No hurry , No Pause !???? 文章目录1、多线程编程基本概念1.1 进程1.2 线程1.3 并发和并行2、多线程的基本使用2.1 继承Thread 类2.2 实现Runnable接口2.3 继承Thread 与实现

qq_51451731的博客 1209
上一篇: JavaSE-多线程(12)- wait notify
下一篇: JavaSE-多线程(2.2)- 锁举例2(Reentrant Lock )
sql2008help
博客等级 码龄11年 80粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值