Java多线程之synchronized关键字

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

一段简单的多线程模拟买票的代码

当使用synchronized关键字时的代码

package thread;

public class test {

    public static void main(String[] args) {
        Ticket t = new Ticket();
        Thread t1 = new Thread(t, "窗口一");
        Thread t2 = new Thread(t, "窗口二");
        Thread t3 = new Thread(t, "窗口三");
        Thread t4 = new Thread(t, "窗口四");

        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

class Ticket implements Runnable {
    private int ticket = 20;

    public void run() {
        while (ticket > 0) {
            synchronized (this) {
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + "-----卖掉" + ticket);
                    ticket = ticket -1;
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

结果如图:

从结果可以看到能够实现多线程的买票

去掉synchronized关键字之后的代码

package thread;

public class test {

    public static void main(String[] args) {
        Ticket t = new Ticket();
        Thread t1 = new Thread(t, "窗口一");
        Thread t2 = new Thread(t, "窗口二");
        Thread t3 = new Thread(t, "窗口三");
        Thread t4 = new Thread(t, "窗口四");

        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

class Ticket implements Runnable {
    private int ticket = 20;

    public void run() {
        while (ticket > 0) {
            //synchronized (this) {
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + "-----卖掉" + ticket);
                    ticket = ticket -1;
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            //}
        }
    }
}

从结果中可以知道,出现了从错误,这是因为当几个线程一起对同一个值进行操作。因此可以通过使用synchronized关键字对要进行操作的值进行加锁,以避免这样的而错误。

在我不断的测试后发现这样的一个情况:

如下图中的代码,在ticket减一的时候使用ticket–时,没有synchronized关键字也能够实现多线程买票的这样的一个操作。

而当在票减一的时候使用ticket = ticket - 1;时,如果没有synchronized关键字就不出现错误。

我认为产生这样不同的情况,应该是当使用上面那样的方式减一的时候,ticket–应该是一个原子操作吧,而当采用下面的方式ticket = ticket - 1;就不是一个原子操作了,因此产生了这样的情况。

【爬虫】Python实现爬取淘宝商品信息(超详细) 项目基于Python的第三方库Selenium模拟浏览器运行、PyQuery解析和操作HTML文档,获取淘宝平台中某类商品的详细信息(商品标题、价格、销量、商铺名称、地区、商品详情页链接、商铺链接等),并基于第三方库openpyxl建立、存储于Excel表格中。# 全局变量count = 1 # 写入Excel商品计数# 启动ChromeDriver服务# 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式# 把chrome设为selenium驱动的浏览器代理;# 窗口最大化。 阅读详情

相关推荐

ICC2 实战秘籍:create_workspace 命令全解析

必选项:工作区名称,这可是创建工作区的 “身份证”,必不可少。技术数据选项匹配:优先考虑用 -technology 直接加载技术文件,这是获取最新、最准确技术数据的首选路径;要是已经有合适的技术库了,那 -use_technology_lib 引用现有技术库也能快速上手。精度设置优先规则:技术文件自动配置排在第一位,能自动适配就别手动操心;要是自动配置不理想,那就显式指定 scale_factor;实在没要求,就用默认配置,但得清楚它的精度限制。

weixin_50820814的博客 1124

JAVA多线程之关键字synchronized

synchronized本意是同步的意思,那么就要先说一下同步的概念了 所谓的同步是指所有的线程不是同时进入到方法中,而是按照顺序一个一个进入方法执行。 使用synchronized处理有两种模式:同步代码块和同步方法 ...

L_R 308

双三相电机控制避坑指南:为什么你的SVPWM谐波大?四矢量调制实战解析

本文深入解析双三相电机控制中SVPWM谐波大的问题,并提供四矢量调制实战方案。通过分析谐波来源、四矢量调制原理及工程实现步骤,显著降低电流THD至3-5%,提升系统效率2.3个百分点。特别适合需要优化电机控制的工程师参考。

weixin_30645617的博客 398

synchorinzed对象监视器为Object时的使用

今天学习了java线程同步的synchronized用法,当监视器对象为Object时,总结了如下知识点:synchronized同步方法1、synchorized修饰非静态方法时,synchorinzed获得的锁都是对象锁,而不是把一段代码或方法当作锁,哪个线程先执行synchronized方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对...

bobozai86的博客 590

ARM架构下Horizon Client安装全攻略:从依赖检查到环境变量配置

本文详细介绍了在ARM架构设备上安装VMware Horizon Client的全过程,包括依赖检查、软件包获取、系统部署和环境变量配置。特别针对华为鲲鹏等ARM平台,提供了从基础准备到性能优化的完整指南,帮助用户高效完成虚拟桌面客户端的部署与调优。

github5actions的博客 556

嵌入式工程师成长之路(1)——元件基础(完整版)

为什么你的电路总是“玄学”故障?答案藏在这些元件里! 0欧电阻竟能引发信号反射?5V转3.3V电平匹配失败导致MCU烧毁?电容降压设计让电源“滋滋”响?——这些坑,本文全填平! 优快云硬件领域头部博主十年踩坑经验汇总,覆盖电阻、电容、电感核心难点+高频实战问题,让你从“调试地狱”直通“一次成功”!

云轩阁 2万+

java多线程-synchronized关键字详解

java多线程-synchronized关键字详解

二萌的博客 593

【华为OD机试真题】45、 分糖果 | 机试真题+思路参考+代码解析(C++、Java、Py、JS)

### 🎃题目描述 >小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。 >  当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。 >  小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 1290

Java多线程之synchronized关键字全面总结2.0

为了避免出现上一张的结果,那么Java就是用了synchronized关键字。 再使用了synchronized关键字之后 一个类的实例如果想调用锁住的代码,那么这个实例必须要能够拿到对应的锁才行。而一个锁只能同时被一个实例拿到。 那么判断的根本依据就在于:实例需要拿到的是不是同一个锁! 如果是同一个锁,那么对应代码就不能同时执行,如果不是同一个锁,那么对应的代码就可以同时执行。 他有四种情...

bbqe597的博客 282

SSE 传输过程中,丢失空格和回车符,怎么解决?

Server - Sent Events(SSE)即服务器发送事件,是 HTML5 中的一项 Web API,用于实现服务器向客户端浏览器推送实时数据的功能。

934

从 Token 到 Agent:一文串起 AI 大模型核心概念

摘要:本文系统解析了现代AI系统的八大核心概念:Token(语言处理的最小单位)、Context(AI的短期记忆)、Prompt(指令接口)、Tool(能力扩展器)、MCP(工具生态协议)、Agent(自主智能体)和AgentSkill(专业技能封装)。文章揭示了这些概念如何共同构成AI从基础语言理解到自主决策的技术脉络,重点阐述了Token对计算成本的影响、Prompt工程的重要性、Tool如何突破AI的能力边界,以及Agent如何通过"感知-规划-执行-反思"循环完成复杂任务。最后指

jundao1997的专栏 251

Java多线程 synchronized关键字

1、在Java多线程中,没用使用synchronized关键字:// 业务类 class Example { // threadName 线程名称 public void executeOne(String threadName) { for (int i = 0; i < 10; ++i) { try { Thread.s

chunxuexm的专栏 600

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java 多线程 synchronized关键字详解

多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。 同步机制可以使用synchronized关键字实现。 当synchronized关键字修饰一个方法的时候,该方法叫做同步方法。 当synchronized方法执行完或发生异常时,会自动释放锁。 下面通过一个例子来对synchronized关键字的用法进行解析。 1.是否使用synchronized关键字的不同 public class ThreadTest { public s

weixin_53341657的博客 189

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java 多线程(六) synchronized关键字详解

Java 多线程(六) synchronized关键字详解 Java 多线程(六) synchronized关键字详解   多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。   同步机制可以使用synchronized关键字实现。   当synchronized关键字修饰一个方法的时候,...

pxs666的博客 98

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

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

不更新了 1150

java多线程关键字synchronized用法

相信大家在开发中肯定会用到多线程的知识,而"synchronized"关键字肯定会用到的,这个修饰符在多线程里用来同步的,就是上锁的对象对应的方法或者代码块同一段时间内只能被一个线程调用,其他的线程就要等待。 java里面每个对象都有一把锁,当线程访问这个对象监视的方法或者代码块时,就会给这个对象上锁,访问结束后解锁,其他等待的线程方能访问这些同步的方法或者代码块。 注意:"sync.........

Alex老夫子的专栏 1195

Java 多线程(二) Synchronized与Volatile关键字

前言 在上章中,我们介绍了Java Thread API.本章我们介绍下Java中的Synchronized与Volatile关键字. 在本章中,我们将介绍如下的几个模块: Synchronized关键字 线程安全问题 synchronized 关键字的使用 对象锁与类锁 Synchronized关键字修饰final类型的变量 & 静态变量 Volatile关键字 Volatil...

Be yourself. 814

Java 多线程之synchronized关键字详解

学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:286945438我们一起学Java! 多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能...

chuifuhuo6864的博客 143

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

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

dht91597的博客 178

java 线程锁的关键字_Java多线程中synchronized关键字的使用方法

关于多线程Thread方法的几点总结,isAlive方法判断线程是否存活 ,wait方法传入参数0无限期等待yield方法让出cpu执行权大家再次公平竞争join方法等待线程执行完一起运行,比如子线程运行循环累加,主线程运行at.join(0),一直等他累加完,主线程在运行下面的打印语句,相当于主线程在等待子线程的运行完成守护进程不主导虚拟机的运行,守护进程设置方法为thread.daemon(t...

weixin_33911375的博客 197

java多线程-Synchronized关键字详解

Synchronized关键字开篇定义作用应用场景原理具体使用使用方式特别注意其他控制并发 / 线程同步方式Lock、ReentrantLock简介区别Compare And Swap(CAS)定义:原理优点典型应用:AtomicInteger 开篇 在Java中,有一个常被忽略 但 非常重要的关键字Synchronized 今天,我将详细讲解 Java关键字Synchronized的所有知识,希...

lijianbiao0的博客 900

Java多线程之synchronized关键字全面解析1.0

Java在多线程方面有一个synchronized关键字。这个关键字可以称为Java高并发之魂。为什么要引入synchronized关键字呢??我们可以先看一个案例: 首先我们写一个L类负责打印消息 public class L { public static void p(String str) { System.out.println(str); } } 然后我们来写一个测试类...

bbqe597的博客 256

java 多线程编程指南 pdf_Java 多线程并发编程之 Synchronized 关键字

阅读本文约需要7分钟大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了下Java Web 模板代码生成器的设计与实现的相关知识,今天跟大家分享Java 多线程并发编程之 Synchronized 关键字的知识。参考来源:http://www.codeceo.com/article/java-synchronized-...

weixin_39982537的博客 68

Java多线程中【 synchronized 】关键字的作用!

Java多线程中[ synchronized ]关键字的作用!

修行时 513

Java多线程 volatile synchronized关键字

多线程 ——一个程序可以包括多个子任务,可串行 / 并行 ——每个子任务可称为一个线程 ——如果一个子任务阻塞,程序可将CPU调度另一个子任务工作,确保CPU时间片获取率和使用时间   相较于多进程优势 ——线程间共享数据 ——线程间通讯更为高效 ——线程是轻量级的,切换更为方便 ——多个线程更易管理   Java多线程方法 ——java.lang.Thread      ...

一只老风铃 425

JAVA初学者如何理解多线程之synchronized关键字

synchronized关键字是Java多线程模型下的一个关键字,其英文意思是同步的意思,主要运用在资源共享当中,也就是说, 当你需要使用多个线程对象共享资源的时候,synchornized关键字就可以大显身手了。 初学者学到线程,对线程应该有所了解,线程是进程的一部分,所以线程和进程具有许多相同的特性,其中最突出的就是线程的并发性(在Java语言中,并发并不是指同时发生,而是他们之间有顺序的,只不过其运行速度让我们看见像是一起执行的一样,这点需要清楚)。 既然不是一起执行,那么肯定就会有先后顺序,那

qq_44867387的博客 252
上一篇: POJ 1061 青蛙的约会(扩展欧几里得)
soldier_wing
博客等级 码龄11年 36粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值