java多线程设计模式详解之二--线程同步

  由于同一进程内的多个线程共享内存空间,在Java中,就是共享实例,当多个线程试图同时修改某个实例的内容时,就会造成冲突,因此,线程必须实现共享互斥,使多线程同步。
  
  最简单的同步是将一个方法标记为synchronized,对同一个实例来说,任一时刻只能有一个synchronized方法在执行。当一个方法正在执行某个synchronized方法时,其他线程如果想要执行这个实例的任意一个synchronized方法,都必须等待当前执行synchronized方法的线程退出此方法后,才能依次执行。
  
  但是,非synchronized方法不受影响,不管当前有没有执行synchronized方法,非synchronized方法都可以被多个线程同时执行。
  
  此外,必须注意,只有同一实例的synchronized方法同一时间只能被一个线程执行,不同实例的synchronized方法是可以并发的。例如,class A定义了synchronized方法sync(),则不同实例a1.sync()和a2.sync()可以同时由两个线程来执行。
  
  Java锁机制
  
  多线程同步的实现最终依赖锁机制。我们可以想象某一共享资源是一间屋子,每个人都是一个线程。当A希望进入房间时,他必须获得门锁,一旦A获得门锁,他进去后就立刻将门锁上,于是B,C,D...就不得不在门外等待,直到A释放锁出来后,B,C,D...中的某一人抢到了该锁(具体抢法依赖于JVM的实现,可以先到先得,也可以随机挑选),然后进屋又将门锁上。这样,任一时刻最多有一人在屋内(使用共享资源)。
  
  Java语言规范内置了对多线程的支持。对于Java程序来说,每一个对象实例都有一把“锁”,一旦某个线程获得了该锁,别的线程如果希望获得该锁,只能等待这个线程释放锁之后。获得锁的方法只有一个,就是synchronized关键字。例如:
  

  public class SharedResource {

   private int count = 0;
  
   public int getCount() { return count; }
  
   public synchronized void setCount(int count) {
this.count = count;
}
  
  }
  

  同步方法public synchronized void setCount(int count) { this.count = count; } 事实上相当于:
  

  public void setCount(int count) {
  synchronized(this) { // 在此获得this锁
  this.count = count;
  } // 在此释放this锁
  }
  


  红色部分表示需要同步的代码段,该区域为“危险区域”,如果两个以上的线程同时执行,会引发冲突,因此,要更改SharedResource的内部状态,必须先获得SharedResource实例的锁。
  
  退出synchronized块时,线程拥有的锁自动释放,于是,别的线程又可以获取该锁了。
  
  为了提高性能,不一定要锁定this,例如,SharedResource有两个独立变化的变量:
  

  public class SharedResouce {
  private int a = 0;
  private int b = 0;
  
  public synchronized void setA(int a) { this.a = a; }
  
  public synchronized void setB(int b) { this.b = b; }
  }
  

  若同步整个方法,则setA()的时候无法setB(),setB()时无法setA()。为了提高性能,可以使用不同对象的锁:
  

  public class SharedResouce {
  private int a = 0;
  private int b = 0;
  private Object sync_a = new Object();
  private Object sync_b = new Object();
  
  public void setA(int a) {
  synchronized(sync_a) {
  this.a = a;
  }
  }
  
  public synchronized void setB(int b) {
  synchronized(sync_b) {
  this.b = b;
  }
  }
  }
深入理解Java多线程同步机制 本文还有配套的精品资源,点击获取 简介:在Java中,多线程同步是确保并发操作中数据一致性和程序正确性的关键。本课程将详细探讨多线程同步的概念,解释线程的定义和创建方式,并介绍Java提供的多种同步机制,如synchronized关键字、volatile关键字、Lock接口与ReentrantLock类、Atomic类、ThreadLocal、Condition接口以及Co... 阅读详情

相关推荐

谷歌浏览器崩溃排查:闪退、卡死、网页打不开的修复指南

浏览器多进程架构通过进程隔离、GPU加速和扩展沙箱提升网页渲染效率,但配置损坏、扩展冲突、显卡驱动异常或系统资源不足时,常会以闪退、卡死、白屏、内存占用飙升和能上微信却打不开网页等形式暴露。排查价值在于先分层定位系统、进程、配置扩展与网页内容,再用无痕模式、chrome://crashes、chrome://gpu和浏览器任务管理器收集证据,避免盲目重装。对办公、开发运维和日常维护场景,禁用扩展、关闭硬件加速、刷新DNS缓存、重置配置文件乃至干净重装,都是可复用的工程化处置手段。围绕谷歌浏览器崩溃的典型症状

weixin_34138056的博客 426

Servlet基础(三) Servlet的多线程同步问题

  Servlet基础(三) Servlet的多线程同步问题     Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。   由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的同步问题。     如果在编写Servlet/JSP程序时不注意到多线程的同步问题,这往往造成程序在少量用户访问时没有任何问题,...

weixin_34191845的博客 179

【SLG游戏服务器开发手册】(ROK Like)沙盘地图篇一,菱形瓦片与笛卡尔坐标系的转换(附调试工具)

轴向坐标:以菱形网格对角方向为基准轴,记作(q, r)菱形瓦片宽度 w=2a,高度 h=a(宽高比2:1)

代码时光 981

JAVA多线程,锁,JMM,JUC和高并发设计模式, P8架构师一次给你讲清

前言 今天给大家分享一篇一线开发大牛整理的java高并发核心编程神仙文档,里面主要包含的知识点有:多线程、线程池、内置锁、JMM、CAS、JUC、高并发设计模式、Java异步回调、CompletableFuture类等。 首先,咱们先来看目录 下面是详细的目录 其次咱们来看每个小节都有哪些内容 多线程原理与实战; Java内置锁的核心原理; CAS原理与JUC原子类; 可见性与有序性的原理; JUC显式

jinggege_795的博客 3236

GEE去云处理代码段解读(位运算)

GEE去云处理代码段解读,包含位运算符号解读、bitwiseAnd()函数、eq()函数解读

jiekeheiguanglan的博客 2068

数字信号处理(一):Xilinx Vivado DDS IP核设计实例(文末附源码)

前言 在数字信号处理时我们经常会用到数字变频,包数字下变频(DDC)和数字上变频(DUC),这其中会用到Xilinx公司的DDS IP核或者Altera公司的NCO IP核来产生本振频率,以现数字域信号频谱搬移。本文我们通过例化Xilinx公司的DDS IP核来产生混频器本振输入频率,并给出Modelsim仿真测试结果。 1、Xilinx DDS IP简介 Xilinx公司的DDS IP核使用AX...

FPGA_Designer 1万+

高级应用 java多线程设计模式详解

线程的创建和启动java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。Thread类是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的st

盗也有道>>>> 1299

飞塔CVE-2022-40684复现

admin 无密码直接回车(会提示修改密码)

G3et的博客 1147

java多线程&&设计模式浅了解

一个进程就是一个正在运行的程序。线程就是进程中的执行单位。一个进程里可以有多个线程故而称之为多线程(一个线程只属于一个进程)。线程执行相当于去抢cpu执行的,当执行一个线程未执行完事可能下一个线程开始执行了。

BASK2311的博客 350

【乐企】有关乐企能力测试接口对接-基础版(详细)

乐企能力测试接口对接详细代码以及步骤

九七的博客 7671

Avalonia 超级详细学习指南

什么是 Avalonia?Avalonia 是一个开源的、跨平台的 GUI 框架,允许开发者使用 XAML 和 C# 构建现代化、高性能的桌面应用程序。与其他框架相比,Avalonia 具有强大的跨平台能力和灵活的界面设计。} }()Avalonia 的特点和优势跨平台性:Avalonia 可以在 Windows、Linux、macOS 等多个平台上运行,开发者可以编写一套代码,然后在不同的操作系统上运行相同的应用程序。

仰望星空的博客 1万+

Java 多线程编程:核心原理、同步机制与高并发详解

/ 自定义有界队列和拒绝策略2, // 核心线程数5, // 最大线程数30, // 非核心线程存活时间(秒)new ArrayBlockingQueue<>(10), // 有界队列(容量10)new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略:由调用者线程执行任务。

2301_76740633的博客 2149

海思3516DV300智能算法实现

海思3516DV300智能算法实现

xiaoning132的专栏 936

Java多线程同步和通信

多线程同步 回顾 1 进程:正在运行的程序,操作系统通过进程Id区分不同进程。 2 线程:进程中的一条执行路径。一个进程中可以包含多个线程,至少有一个。 3 区别: a.一个程序运行后至少有一个进程 b.一个进程可以包含多个线程,但是至少需要有一个线程,否则这个进程是没有意义的 c.进程间不能共享资源,但线程之间可以 d.系统创建进程需要为该进程重新分配系统资源,而创建线程则容易的多,...

♾️ 2514

efm32 入门.pdf

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java多线程编程 深入详解

《Java多线程编程 深入详解》读书笔记 第一章 多进程多线程概述 线程概述 进程(PROCESS):CPU的执行路径 多进程:系统中同时运行多个程序 线程(THREAD):运行在进程当中的运行单元 多线程:每个进程里面有多个独立的或者相互有协作关系的运行单元 第二章 多线程详解 线程创建 继承 Thread 类 其中 Thread 实现 Runnable ;符

走在命运的左岸 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java 多线程详解

Java 多线程详解一、基本概念:程序 - 进程 - 线程二级目录三级目录 一、基本概念:程序 - 进程 - 线程 **程序(program)**是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 二级目录 三级目录 ...

鹏鹏程序员的博客 1554

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java多线程与线程同步

java多线程与线程同步 创建多线程的方法(面试)使用那种创建线程更好?Runnable(面试)创建线程有几种方式?错误启动线程的观点:启动线程 Run()与Start()的区别?既然start()方法会调用run()方法,为什么我们选择调用start()方法,而不是直接调用run()方法呢?如何停止线程?通常线程会在什么情况下停止普通情况?线程可能被阻塞2.如果线程在每次迭代后都阻塞正确的停止线程的方法(Interrupt)<通知中断>正确停止的方法:Thread常用方法Sychronized

Amewin的博客 1269

Java 多线程优化:锁优化与线程安全的设计模式

高效的多线程编程不仅能提升系统的性能,还能确保程序在复杂的并发环境中运行稳定。通过合理的锁优化、线程安全设计模式以及使用并发工具包,可以极大地提升并发编程的效率和可维护性。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 900

java多线程设计模式

java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。Thread类是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方

fishriver的专栏 1153

图解多线程设计模式pdf_图解Java多线程设计模式pdf

精选12种与多线程和并发处理相关的设计模式264张图表 + 300段Java示例程序 = 轻松学习多线程编程1.图文并茂 通俗易懂日本资-深技术作家、《程序员的数学》作者结城浩执笔,264张图表(UML类图、时序图、Timethreads图等)穿插文中,通过类比手法和浅显的语言,逐一讲解与多线程和并发处理相关的12种设计模式。每章附带练习题和答案,自学者也可轻松学习2.专业实用 拓展进阶编写了30...

weixin_39790686的博客 757

图解多线程设计模式pdf_图解Java多线程设计模式 PDF 全书扫描版

序章1 Java线程 1I1.1 Java线程 2I1.2 何谓线程 2明为跟踪处理流程,实为跟踪线程 2单线程程序 3多线程程序 4Thread类的run方法和start方法 5I1.3 线程的启动 9线程的启动(1)——利用Thread类的子类 9线程的启动(2)——利用Runnable接口 10I1.4 线程的暂停 12I1.5 线程的互斥处理 13synchronized方法 14sync...

weixin_30839665的博客 1428

多线程设计模式——最后总结

多线程设计模式 最后总结

buyoufa的博客 2405

Java多线程详解

首先要明确几个概念程序:完成特定任务,用某种特殊的语言编写的一组指令的集合进程:是执行路径,一个进程同一时间并行或者正在运行的程序线程:是执行路径,一个进程同一时间并行或者执行多个进程,就是多线程注:进程中也有可能有多个线程CPU也分为多核CPU和单核CPU单核CPU:实际上进行的是某种意义上的假CPU,一个CPU同时做好多事,如果一个没有准备好,就先将该事件挂起,去进行别的,可以用一张图来表示多核CPU(取决与主频来利用哪个):多核CPU就相当于多个单核CPU工作同时也要解释两个词的含义并行:多个CPU任

weixin_63291917的博客 806

java多线程(二)多线程同步与死锁

文章目录1. 同步概述同步的前提:银行存钱案例:2. 同步代码块3. 同步函数静态同步方法使用的锁是该方法所在类的字节码文件对象,也就是和下面方法块相同面试题:单例设计模式安全问题4. 死锁避免死锁1. 锁的顺序2. 超时放弃 1. 同步概述 同步的前提: 必须两个以上的线程 多个线程使用同一个锁 操作共享变量 同步的好处:解决了多线程安全问题。 弊端:每次都需要判断锁,会消耗资源 银行存钱案...

Charles Ren's Tech Blog 816
上一篇: java多线程设计模式详解之一--线程的创建和启动
下一篇: java多线程设计模式详解之三--wait()以及notirfy() 简析
caip
博客等级 码龄22年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值