Java多线程同步 synchronized 关键字的使用

Java多线程的同步:synchronized关键字、Lock接口、volatile关键字 Java 多线程同步是解决资源共享冲突的核心机制,主要通过协调线程对共享资源的访问顺序与权限,避免数据不一致和竞态条件。在多线程的环境中,经常会碰到数据的共享问题,即当多线程需要访问同一个资源时,它们需要以某种顺序来确保该资源在某一时刻只能被一个线程使用,否则,程序的运行结果将会是不可预料的,在这种情况下就必须对数据进行同步。例如多个线程同时对同一数据进行写操作。 阅读详情

代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行它包括两种用法:synchronized 方法和 synchronized 块。

JAVA多线程买票案例

synchronized 同步

用synchronized 块实现同步

    public static void main(String[] args) {
        // runable对象的属性代表了一共多少张票
        // runable对象的run方法实现了买票的动作
        Runnable runnable = new Runnable() {
            private int count = 100;
            @Override
            public void run() {
                while (true) {
                    synchronized (this) { // synchronized 的对象如果
                        Thread currentThread = Thread.currentThread();
                        if (count > 0) {
                            out.println(currentThread.getName()+ " => " + (101 - count) + "张车票");
                            --count;
                        } else {
                            break;
                        }
                    }
                }
            }
        };

        // 开启100个线程模拟100个售票口
        for (int i = 0; i < 100; i++) {
            new Thread(runnable).start();
        }
    }

用synchronized 方法 块实现同步

    public static void main(String[] args) {
        // runable对象的属性代表了一共多少张票
        // runable对象的run方法实现了买票的动作
        Runnable runnable = new Runnable() {
            private int count = 100;

            @Override
            public void run() {
                while (true) {
                    if (synchronizedMethod()) break;
                }
            }

            public synchronized boolean synchronizedMethod() {
                Thread currentThread = Thread.currentThread();
                if (count > 0) {
                    out.println(currentThread.getName() + " => " + (101 - count) + "张车票");
                    --count;
                    return false;
                }
                return true;
            }
        };

        // 开启100个线程模拟100个售票口
        for (int i = 0; i < 100; i++) {
            new Thread(runnable).start();
        }
    }

同步过后的代码输出如下

Thread-0 => 1张车票
Thread-0 => 2张车票
Thread-0 => 3张车票
Thread-4 => 4张车票
Thread-4 => 5张车票
Thread-2 => 6张车票
….
….
Thread-34 => 98张车票
Thread-34 => 99张车票
Thread-34 => 100张车票

非同步

synchronized 块

把同步块删除

synchronized 方法

把 ynchronized 关键字删除

输出结果如下

Thread-0 => 1张车票
Thread-0 => 2张车票
Thread-2 => 1张车票
Thread-2 => 4张车票
Thread-2 => 5张车票
Thread-2 => 6张车票
Thread-2 => 7张车票
Thread-4 => 7张车票
Thread-1 => 1张车票
Thread-1 => 10张车票
Thread-1 => 11张车票
Thread-1 => 12张车票
Thread-1 => 13张车票

可以看出有一个以上的线程访问同一张票
显然是不合理的

`全网最细!! 入门必看Git教程链接:https://gitee.com/all-about-git` 全网 Git 入门教程 gitee.com。如果显示The requested URL returned error: 403错误,那就表示没有和window本地建立token令牌 阅读详情

相关推荐

用户行为数据分析 User Behavior Data from Taobao for Recommendation

一、提出问题 二、理解数据 数据来源 阿里云天池数据集:(https://tianchi.aliyun.com/dataset/dataDetail?dataId=649) 本文选取的数据集为UserBehavior.csv,共有5242880条数据。数据的具体类别如下表所示: 用户行为种类有四种,如下表所示 对于数据维度的说明如下: 在本文选取的2017年11月25日到2017年12月3日的时间范围内,不重复的用户数量为10202,不重复的商品ID数为412369,不重复的商品类目ID数为5859,

cccxxxqq的博客 5206

Java 多线程 --- 线程同步 volatile关键字

volatile keyword 使用volatile保证可见性 使用volatile禁止指令重排

HelloWorld 772

STM32按键中断切换红绿蓝灯

通过以上步骤,我们实现了使用STM32的按键中断来切换红绿蓝LED灯的功能。在实际应用中,可能还需要考虑更多的细节,如按键消抖、更精确的延时实现等。但上述代码提供了一个基本的框架和思路,可以根据具体需求进行扩展和优化。希望这篇博客对您有所帮助!

2301_79865940的博客 952

Java多线程编程基础篇(二)-多线程同步关键字

一、多线程同步关键字-synchronized1.概念    synchronized保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。当多个并发线程访问同一个对象object中的同步代码块时,一个时间内只有一个线程能够得到执行,另一个线程必须等到当前线程执行完这个代码块之后才能执行,但是其他的线程仍然能够访问该object中的非synchro...

qq_41786692的博客 1万+

深入解析Docker Overlay2磁盘空间占用问题及高效清理策略

本文深入解析了Docker Overlay2存储驱动导致磁盘空间占用的核心原因,包括镜像与容器残留、日志文件膨胀、应用层泄漏及驱动特性。提供了从全局检查到精准定位的完整排查方法,并给出了从常规清理到配置优化的多维度高效清理策略,帮助用户从根本上解决Docker磁盘空间问题。

data3的博客 900

哈密顿-雅可比不等式:连接最优控制与优化算法的自然物理原理

在控制理论与优化算法之间,存在一个深刻而实用的桥梁。最优控制理论旨在通过设计控制输入,使动态系统在时间维度上达到性能最优,其核心数学工具如庞特里亚金极大值原理和哈密顿-雅可比-贝尔曼方程,为解决连续时间系统的优化问题提供了优雅框架。然而,这些方法在高维非凸问题中面临求解难题。哈密顿-雅可比不等式作为一种松弛方法,通过构造李雅普诺夫函数并验证一个不等式条件,转而寻求性能有保障且易于实现的次优解,其本质是保证系统能量衰减和性能上界。这一原理与耗散性理论紧密相连,体现了自然物理系统(如阻尼振动)中能量耗散的普遍规

weixin_30582943的博客 313

java多线程基础---synchronized与ReentrantReadWriteLock的介绍与比较

(1) 创建一个ReentrantReadWriteLock对象 [java] view plain copy private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();   (2)抽取读锁和写锁: [java] view pla

CottonDuke的博客 544

【冷冻电镜】RELION5.0使用教程总结

对于您自己的数据,您可能希望使用各种倾斜系列对齐方法,然后比较每种方法生成的断层扫描图像的质量(参见下一步)。通过检查 CtfFind job 的 tilt_series 目录中的star文件来检查几个倾斜系列的散焦值。GitHub上也有人反应这个问题,目前我的解决方案是下载了较低版本的CTFFIND的,降级到4.1.10可以成功运行。此外,logfile.pdf 文件包含所有显微照片的有用参数图,例如散焦、像散、估计分辨率等,以及整个数据集中这些值的直方图。的目录,以及指向此目录的符号链接。

进阶中的程序员吃吃的博客 4233

Java多线程:线程同步与关键字synchronized

一、同步的特性 1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法. 2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1: http://blog.youkuaiyun.com/huang_xw/article/details/7318561 3. 如果两个线程要执行一个类中的同步方法, 并且两个线程使用相同的实例来调用方法, 那么一次只

清风小阁 7271

【文献笔记】ICCV 2021 | Point Transformer

作者提到,特别适合点云处理,因为自注意力机制是的核心,本质上就是一个集合算子:它对输入元素具有顺序不变性和数量不变性3D点云是无序的,即使改变点云txt文件中的点顺序也不会有任何影响。自注意力机制天然具有排列不变性,因为它通过对所有"点对"的关系进行建模来处理输入,而不依赖于任何特定的输入顺序点云数据通常覆盖了3D空间中的对象或场景,理解这些数据需要捕捉点与点之间复杂的空间关系。自注意力机制能够有效的捕捉这些关系,因为它为每个"点对"赋予一个。

m0_55908255的博客 965

全球气候模式降尺度方法总结及其代码实现

简介总结各类型气候模式降尺度方法

WW、forever的博客 1万+

Java多线程:使用Synchronized关键字同步类方法

本文介绍使用Synchronized关键字同步类方法。要达成Java多线程的run方法同步,需要在void和public之间加上synchronized关键字。   要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下: public synchronized void method() { }   从上面的代...

Jelly_JAVA博客 188

EPO: Hierarchical LLM Agents with Environment PreferenceOptimization

长期决策和规划任务依然是基于大型语言模型(LLM)的智能体面临的一大挑战(Valmeekam 等,2023;Liu 等,2023;Silver 等,2024)。这些任务需要智能体进行多步骤的规划,同时保持行为的一致性和目标导向,这对于通常被设计用于即时和局部预测的大型语言模型来说颇为困难。此外,针对具身智能体的大型语言模型微调面临的一个关键难题是大规模标注数据的需求(Reed 等,2022)。

qq_52053775的博客 142

初学Java多线程:使用Synchronized关键字同步类方法

初学Java多线程:使用Synchronized关键字同步类方法 本文介绍使用Synchronized关键字同步类方法。要达成Java多线程的run方法同步,需要在void和public之间加上synchronized关键字。 AD: 要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下: p

小范屯 1103

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java中利用synchronized关键字实现多线程同步问题

Java 中多线程同步问题,以前一直是个很模糊的概念。再三查阅资料和Demo实例之后,自己对齐终于有点理解。供大家参考学习

caolipeng_918的专栏 1571

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java多线程-2(线程同步synchronized关键字)

为何要实现线程同步 多线程机制的目的是为了能并发执行程序,为何要实现线程间同步,使其看起来像是让每个线程按顺序执行呢?答案是:当线程之间没有“相交点”(共享资源)时,不需要线程同步,但是当操作某个线程间共享资源(如静态变量),就需要实现线程同步。 java提供的线程同步机制 一.synchronized关键字 1.当synchronized关键字修饰方法 a.大部分人熟悉的线程同步方式是上锁,...

qq_30507459的博客 798

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java 多线程:synchronized 多线程同步关键字

前言在 多线程生成的原因(Java内存模型与i++操作解析) 中,介绍了Java的内存模型,从而可能导致的多线程问题。synchronized就是避免这个问题的解决方法之一。除了 synchronized 的方式,还有 lock,condition,volatile,threadlocal,atomicInteger,cas等方式。synchronized 用法它的修饰对象有几种: 1. 修饰一个

不更新了 1149

深入剖析Java多线程同步:synchronized关键字与哲学家就餐问题实战指南

大家好!今天让我们一起揭开Java多线程同步中的神秘面纱,特别是那个至关重要的关键字——synchronized。我们将从多线程的基础知识开始,逐步深入理解synchronized的工作原理,并通过一些生活化的例子帮助大家更好地消化这些概念。synchronized关键字帮助我们在多线程环境中维持数据的一致性和正确性,防止了竞态条件的发生。然而,过度或不当使用synchronized可能导致性能下降,比如过多的线程争抢同一把锁可能会造成“线程饥饿”或“活锁”等问题。

Z__10的博客 1259

[Java中的多线程同步深入理解synchronized关键字的工作原理]

synchronized关键字是Java线程同步的基石。它通过对象内部监视器锁(Monitor)来实现互斥访问,并借助JVM的锁升级优化策略(偏向锁、轻量级锁、重量级锁)来有效平衡性能与线程安全的需求。理解其从语法语义到JVM底层实现的完整工作机制,是每一位Java开发者掌握并发编程、构建高性能高可靠性应用的必备知识。

f3051709的博客 705

Java多线程同步 synchronized关键字的简单使用

Java有许多进程同步的方法,其中synchronized关键字的使用比较简单。Java每个对象都有一个内部锁,用synchronized关键字直接修饰方法,可以在方法调用时自动上锁,在方法结束调用时自动解锁。 线程未同步示例 注意:Thread.sleep(x)线程延时方法一定要有,不然可能会因为程序执行太快看不到进程冲突,导致数字正常减小。 public class Main { public static void main(String[] args) { MyRunnabl

qq_44829047的博客 209

Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)

关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象。本文探讨synchronized关键字。 synchronized关键字可以修饰方法,可以修饰代码块,但不能修饰构造器、属性等。 对synchronized(this)的一些理解 当两个并发线程访问同一个对象object中的这个synchr...

qq_41494853的博客 310

JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

JAVA之旅(十三)——线程的安全性, 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程)把票陆陆续续的卖完了之后,我们要反思一下,这里面有没有安全隐患呢?在实际情况中,这种事情我们是必须要去考虑安全问题的,那我们模拟一下错误 package com.lgl.hellojava;import javax.security.auth.callback.TextIn

刘桂林的博客 1万+

Java从入门到放弃31---多线程并发问题/线程同步/Synchronized关键字/同步方法/同步块

Java从入门到放弃31—多线程并发问题/线程同步/Synchronized关键字/同步方法/同步块 01 并发问题 同一个对象被多个线程同时操作,每个线程在自己的工作内存交互,内存控制不当会造成数据不一致。 举例:上万人同时抢100张票,线上线下同时取一张银行卡上的钱,不安全的集合问题。 解决方案: 加入休眠是为了放大问题的发生性,便于发现问题。 锁机制(队列+锁):由于同一线程的多个进程共...

DOGIOOH的博客 193

java 线程 synchronized_java多线程编程之使用Synchronized关键字同步类方法

public synchronized void run(){}从上面的代码可以看出,只要在void和public之间加上synchronized关键字,就可以使run方法同步,也就是说,对于同一个Java类的对象实例,run方法同时只能被一个线程调用,并当前的run执行完后,才能被其他的线程调用。即使当前线程执行到了run方法中的yield方法,也只是暂停了一下。由于其他线程无法执行run方法,...

weixin_39924674的博客 197
上一篇: Java 多线程
下一篇: Java 多线程中 Thread类 join方法的使用
httpfirewall
博客等级 码龄10年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值