多线程之线程的同步

面试突击37:线程安全问题的解决方案有哪些? Python微信订餐小程序课程视频 https://edu.youkuaiyun.com/course/detail/36074 Python实战量化交易理财系统 https://edu.youkuaiyun.com/course/detail/35475 线程安全是指某个方法或某段代码,在多线程中能够正确的执行,不会出现数据不一致或数据污染的情况,我们把这样的程序称之为线程安全的,反之则为非线程安全的。在 Java 中,解决线程安全问题有以下 3 种手段: 使用线程安全类,比如 AtomicInteger。 加锁排队执行 使 阅读详情

1前言:线程的同步的知识略微杂乱,通过自己的学习做一些对基本知识的记录和梳理。以后有机会再干个大的。
2 线程同步的引子
2.1代码分析

//模拟火车站售票程序,开启三个窗口售票。
public class TestTrainTickets implements Runnable {
     
    private int ticketNum = 100;

    @Override
    public void run() {
            while (ticketNum > 0) {
                System.out.println("剩余的票数" + ticketNum);
                ticketNum--;
       }
    }
    
    public static void main(String[] args) {
        TestTrainTickets tickets = new TestTrainTickets();
        new Thread(tickets).start();
        new Thread(tickets).start();
        new Thread(tickets).start();
    }

2.2 通过执行代码,可知此代码出现了线程安全问题。
2.2.1出现线程安全问题的原因

  • 当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。

2.2.2 怎么解决线程安全问题

  • 对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可参与执行。-----同步锁机制

3 Synchronized的使用方法
3.1 同步代码块

synchronized (对象){
// 需要被同步的代码;
}

3.2同步方法

//synchronized还可以放在方法声明中,表示整个方法为同步方法。
public synchronized void show (String name){ 
….
}

3.2为什么Synchronized能实现同步机制----锁

  • 同步锁机制
在《Thinking in Java》中,是这么说的:对于并发工作,
你需要某种方式来防止两个任务访问相同的资源(其实就是共享资源竞争)。 
防止这种冲突的方法就是当资源被一个任务使用时,在其上加锁。
第一个访问某项资源的任务必须锁定这项资源,使其他任务在其被解锁之前,就无法访问它了,
而在其被解锁之时,另一个任务就可以锁定并使用它了。
  • synchronized的锁是什么?
任意对象都可以作为同步锁。所有对象都自动含有单一的锁(监视器)。 

 同步方法的锁:静态方法(类名.class)、非静态方法(this) 

 同步代码块:自己指定,很多时候也是指定为this或类名.class
  • 注意:

必须确保使用同一个资源的多个线程共用一把锁,这个非常重要,否则就无法保证共享资源的安全
 一个线程类中的所有静态方法共用同一把锁(类名.class),所有非静态方法共用同一把锁(this),同步代码块(指定需谨慎)

4Lock(锁)

  • 什么是lock锁
从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。 

 java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象。

 ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以显式加锁、释放锁。
  • 怎么用lock锁
class A{
private final ReentrantLock lock = new ReenTrantLock();
public void m(){
lock.lock();
 try{
//保证线程安全的代码;
 }
 finally{
lock.unlock(); 
}
 } 
   }

//注意:如果同步代码有异常,要将unlock()写入finally语句块
  • synchronized 与 Lock 的对比
1. Lock是显式锁(手动开启和关闭锁,别忘记关闭锁),synchronized是隐式锁,出了作用域自动释放

2. Lock只有代码块锁,synchronized有代码块锁和方法锁

3. 使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)

5 释放锁的操作

 当前线程的同步方法、同步代码块执行结束。

 当前线程在同步代码块、同步方法中遇到break、return终止了该代码块、该方法的继续执行。

 当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束。

 当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释放锁。
  • 完结
线程安全问题以及其解决方法 1.为什么会出现线程安全问题?2.判断一个多线程应用程序是否有问题的标准:3.如何解决多线程安全问题呢?4.同步代码块(synchronized)/同步代码块的格式:/锁的分类:/用锁解决案例问题:/同步的好处和弊端: 5.死锁问题 为什么会出现线程安全问题呢?为什么会几个窗口出售同一张票,0票甚至负票呢?请看图!!!!!这个同步代码块保证数据的安全性的一个主要因素就是这个对象. 注意这个对象要定义为静态成员变量才能被所有线程共享.这个对象其实就是一把锁.这个对象习惯叫做监视器.如果出现了同步嵌套,就会. 阅读详情

相关推荐

线程安全方式有哪些 ???

线程安全方式有哪些 ???一 互斥同步synchronizedlock同步容器二 无同步方案可重入代码 (Reentrant Code)线程本地存储 (Thread Local Storage)ThreadLocal三 其他String (不可变类等)总结 线程安全方式有哪些 ???一 互斥同步synchronizedlock同步容器二 无同步方案可重入代码 (Reentrant Code)线程本地存储 (Thread Local Storage)ThreadLocal三 其他String (不可变类等

weixin_37701609的博客 972

java中的线程安全

加了锁之后,有一个线程进到锁里面没有出来,导致锁资源没有得到释放,其他线程一直等待锁资源的释放,这样就导致了死锁的产生同步代码块和同步方法都是自动释放锁资源,所以不容易出现死锁;如果需要演示死锁案例;在同步锁中需要进行锁嵌套;注意:此处只是为了测试死锁,才进行的锁嵌套;以后使用时尽量避免锁嵌套(避免死锁)线程池:就是装线程的容器,预先在容器中创建指定个数的线程对象;当用户需要时,直接俄从容器中获取;用完了,再回收到线程池中(用完了放回去之前创建线程的方式:创建线程对象后,执行完毕则销毁线程对象;

qq_66013742的博客 3286

VC++ MFC 多线程及线程同步

 VC++ MFC 多线程及线程同步关键词: MFC    多线程及线程同步                                           VC++6.0; 线程同步;临界区;事件;互斥;信号量;   使线程同步  在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。

Holym的网摘 3870

Java线程安全

前段时间有测试一个后端对账单和话单采集服务,在测试过程中有涉及到数据库读写逻辑和并发的场景,所以结合经验针对系统技术架构设计了部分并发场景结合数据库读写时可能出现的一些问题的用例,也确实出现了一些测试环境容易忽视,线上环境确确实实可能出现的问题,当然最后还是得到了妥善的解决.下面说说后端测试应该考虑的一些线程安全和数据读写方面的问题. 前提:测试环境的架构尽量向线上环境的架构靠拢,比如线上如果采用分布式集群,测试环境如果是单机,那么部分问题自然无法暴露,如果测试环境无足够资源模拟线上的几十台集群环境,那么

qq_40132294的博客 2万+

iOS多线程编程:线程同步总结

1:原子操作 - OSAtomic系列函数 iOS平台下的原子操作函数都以OSAtomic开头,使用时需要包含头文件。不同线程如果通过原子操作函数对同一变量进行操作,可以保证一个线程的操作不会影响到其他线程内对此变量的操作,因为这些操作都是原子式的。因为原子操作只能对内置类型进行操作,所以原子操作能够同步的线程只能位于同一个进程的地址空间内。 2:锁 - NSLock系列对象 iOS平台下的

lifengzhong的专栏 2万+

多线程、线程同步的基本了解

一、什么是多线程? 程序:是含有命令和数据的文件,被存在磁盘或其他数据存储设备中,也就是说程序是静态的代码; 进程:是程序的一次执行过程,是程序运行的基本单位,因此进程是动态的。系统运行一个程序既是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,他在计算机中一个指令接着一个指令的执行着,同时,每一个进程还占有某些系统资源如 CPU 时间,内存空间,文件,输入输出设备的使用权限等等。 线程:与进程类似,但线程是一个比进程还小的执行单位,一个进程在其执行的过程中可以产生多

hh1375691712的博客 794

Linux多线程——线程互斥与同步

摘要:多线程并发访问共享资源时存在数据竞争问题,需通过互斥锁和同步机制解决。 临界资源与竞争问题:多线程同时操作全局变量(如g_val--)时,由于CPU指令的非原子性,可能导致数据不一致。例如,线程切换时未完成的操作会使变量值异常。 互斥锁保护:通过pthread_mutex_t实现加锁(pthread_mutex_lock)和解锁(pthread_mutex_unlock),确保临界区代码的原子性。锁的粒度应尽量细以减少性能损失。 线程同步:条件变量(pthread_cond_t)解决线程间执行顺序问题

2401_83603768的博客 1455

synchronized同步的实现——多线程购票

同步的由来 当两个或两个以上的线程需要共享资源,必须使用某种方法来确定资源在某一时刻仅被一个线程占用,达到此目的的过程叫做同步。(synchronized) 同步的实现 方法级同步(method-level synchronized) synchronized void method( ) { //同步的方法 } 对象级同步( block-level syn...

footprint01的博客 1174

一文讲清多线程和多线程同步

一个进程内多个线程并发执行的情况就叫多线程,每个线程是一个独立的执行流,多线程是一种编程模型,它与处理器无关、跟设计有关。并行计算:充分利用多核,提升整体吞吐,加快执行速度。后台任务处理:将后台线程和主线程分离,在特定场景它是不可或缺的,如:响应式用户界面、实时系统等。我们用2个例子作说明。同一进程内的多个线程会共享数据,对共享数据的并发访问会出现(竞争状况)。协调多个线程对共享数据的访问,避免出现数据不一致的情况。

excellent_fish_c的博客 1862

AI 小说生成器本地部署完全指南

这篇文章介绍了本地部署AI小说生成器的完整指南,主要面向网文作者、内容创作者和AI爱好者。文章从环境搭建到创作实践,详细讲解了三种主流部署方案:Ollama(推荐新手)、LMStudio(图形界面)和text-generation-webui(高级定制)。内容涵盖硬件需求、系统架构、模型选择、API对接、提示词工程等关键技术环节,并提供了小说创作的特制提示词模板和参数调优建议。文章还讨论了长篇小说管理、多模型协作等进阶技巧,以及版权伦理等法律问题。最后推荐了相关工具资源和社区论坛,帮助读者实现安全、高效、可

珂珂可爱多 2243

【机械臂算法】基于最小惯性参数集的动力学辨识仿真实践

本文深入探讨了机械臂动力学参数辨识的核心挑战与解决方案,重点阐述了基于最小惯性参数集的理论与方法。通过分析PUMA560实例,详细介绍了利用QR分解法或符号推导法获取可辨识参数集,并系统讲解了从激励轨迹设计、仿真数据采集、线性系统求解到模型验证的完整实践流程,为高精度动力学建模与控制奠定了坚实基础。

weixin_29054399的博客 376

java多线程 —— 多线程同步器

1、什么是多线程同步器? 可以理解为,用于控制多线程之前同步动作的工具。 2、为什么使用多线程同步器? 在实际应用中,我们希望多线程根据某些一些特定的规则执行。因此有了多线程同步器,通过不同的多线程同步器,可以让多线程实现多样的行为。 3、多线程同步器介绍 3.1、Samaphore 应用场景:对于一组有限制都资源访问。比如餐厅有2个位置但同时有10个人要吃饭,则要控制10个人对餐位的并发实用。即当餐位有空余时,就会有人用餐,没有空余时,则进入阻塞等待。 用法:定义Semaphore变量sem

向来缘浅,奈何情深 2741

unity 在透明物体上投射阴影

unity版本:2019.4.16 创建一个shader,代码如下: Shader "ChuckLee/ARShadow" { Properties { _ShadowColor("Shadow Color", Color) = (0.1, 0.1, 0.1, 0.53) } SubShader { Tags{ "RenderType" = "Transparent" "Queue" = "Geometry+1" } Blend SrcAlpha OneMinusSrcAlph

Abel02的博客 2953

Java多线程——线程同步

简单讲解了java多线程中可能会出现的线程同步问题,并讲解怎么使用synchronized和ReentrantLock锁来解决问题

2501_90745824的博客 1095

[Ethernet in CANoe]2--如何在CANoe中去仿真CP版本的SOME/IP通信

上篇文章()介绍了SOME/IP的两种类型的数据格式,根据作者目前的项目经验,目前在CANoe V18之前的版本,CP版本的arxml是最方便实现SOME/IP以太网仿真的。作者目前只有CANoe V17的license,所以本片文章是在CANoe 17上基于CP版本的arxml去做仿真模拟。

汽车ECU自动化测试 1764

Bentley ORD(openroads designer) 二次开发(BIM)第七节 在ORD SDK中调用MicroStation SDK

从课程刚开始的时候我们就通过学习,了解了ORD的开发是基于MicroStation的,ORD SDK的接口发布的时候也对MicroStation SDK也做了一次发布。这一章将以我们对ORD SDK知识的了解为基础,使用ORD SDK的接口读取道路几何信息、计算桩号,然后再使用MicroStation SDK 读取地形数据和计算投影点的位置,并创建一组方柱形状的Soild。计算方柱底部坐标要经过两大步骤,通过路线的桩号及偏移距离去定位方柱的平面位置,通过方柱的平面位置计算数字地面模型上的投影点的坐标。

chen286990651的博客 880

多线程概念以及线程同步

并发与并行概念,多线程概念.通过synchronized关键字或者Lock锁解决线程安全问题.线程通讯.

weixin_69812259的博客 1063

手把手教你用U盘给海信IP501H刷机:GK6323V100C芯片的4.4.2和9.0固件实战

本文详细介绍了海信IP501H电视盒子基于GK6323V100C芯片的刷机实战指南,涵盖Android 4.4.2强刷和Android 9.0免拆刷机两种方案。从工具准备、短接操作到ADB调试,提供全流程解析和常见问题解决方案,帮助用户安全高效地完成刷机操作。

lemon的博客 1454

Java中关于同步,异步,多线程,多线程同步,并发,并行的一些总结

1.同步与异步1.1同步在多线程的环境中,经常会碰到数据共享的情况,即当多个线程共同需要访问一个资源时,他们需要以某种顺序来确保该资源在某一时刻只能被一个线程使用,否则,程序的运行结果将是不可预料的,在这种情况下就必须对数据进行同步,例如多个线程同时对同一数据进行写操作,即当线程A需要使用某个资源时,如果这个资源正在被线程B使用,同步机制就会让线程A一直等待下去,直到线程B结束对该资源的使用后,线程

优快云_FTD的博客 3171

vscode中运行gcc -v命令失败了,提示:gcc不是内部或外部命令...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 975

windows在使用ping 127.0.0.1时出现一般故障的解决方案

本文主要介绍了windows在使用ping 127.0.0.1时出现一般故障的解决方案,希望能对使用windows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 6万+

C# 多线程(2)——线程同步

当在同一时刻多个线程操作共享资源时就会导致数据的错误,但是如果在单一线程中按照顺序就不出现这样的问题,这也就引申出线程同步的内容,保证多个线程提升性能的前提下,也不会出现程式数据的错误,重点就是让多个线程按照一定的顺序同步的执行代码,就是线程同步的概念。lock 排它锁的使用,确保了多个线程在访问竞态代码块时,只有一个线程是获得CPU时间片的,其他的线程处于阻塞中,并处于一个等待队列中。直到锁被释放,等待的线程属于先到先得的情形,依次等待获得锁去执行竞态代码块,保证了线程同步,因此可以保证线程的安全。

contact97的博客 2121

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java多线程之线程同步

线程同步 线程同步:当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多。 为什么要创建多线程? 在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程。 为什么要线程同步 多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地址进行写入,由于CPU时间调度上的问题,写入数据会被多次的覆盖,所以就要使线程同步。 例如:我们去银行存钱,那肯.

wshjk的博客 3375

efm32 入门.pdf

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

多线程---线程同步,线程通信

线程同步是多线程编程中的一个重要概念,它指的是在多线程环境中,通过一定的机制保证多个线程按照某种特定的方式正确、有序地执行。这主要是为了避免并发问题,如死锁、竞态条件、资源争用等,确保数据的一致性和完整性。当多个线程共享同一份资源时,由于线程的执行顺序是不确定的,可能会出现线程安全问题。例如,两个线程同时对一个共享变量进行操作,可能会出现预期之外的结果。如下:小明和小弘对同一账号取钱,会出现余额为负的情况//操作账户try {

weixin_53333436的博客 1548

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Python 多线程同步

Python 提供了丰富的线程同步机制,从基础的LockSemaphore到更高级的ConditionEvent和Barrier,以及线程安全的Queue。选择何种机制取决于具体场景:保护简单共享变量可用Lock;控制资源并发数用Semaphore;实现线程间依赖和通知用Condition或Event;在线程间传递数据则优先使用Queue。同时,必须注意 GIL 对多线程并行的限制,并遵循避免死锁、最小化锁范围等最佳实践,才能编写出高效、健壮的多线程程序。

xingzhemengyou1的博客 1293
上一篇: 一句话明白啥是微服务,分布式,集群
下一篇: 多线程之线程的通信以及死锁
jothan_lee
博客等级 码龄9年 30粉丝 58原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值