JavaGuide(3)

news2024/11/24 16:30:12

一、项目背景与简介

JavaGuide由GitHub用户Snailclimb开发并维护,是一个全面而深入的Java学习资源库。它旨在为Java初学者和有经验的开发者提供一个系统的学习路径和丰富的资源,帮助他们系统地学习和巩固Java及相关技术知识。

二、项目内容与特点

  1. Java基础:详细解释了Java的基本概念、语法和核心类库,为初学者打下坚实的基础。
  2. 集合框架:深入分析了ArrayList、LinkedList、HashMap等常用集合类的源码和使用场景,帮助开发者更好地理解和应用这些集合类。
  3. 并发编程:涵盖了线程、锁、并发集合等高级并发编程知识,帮助开发者掌握Java并发编程的核心技术。
  4. JVM:详细介绍了Java虚拟机的内存模型、垃圾回收机制和类加载过程,让开发者对Java的运行环境有更深入的了解。
  5. 新特性:总结了从Java 8到最新版本的各个版本的新特性,帮助开发者紧跟Java技术的最新发展。

此外,JavaGuide还涉及了计算机网络、操作系统、数据结构与算法等计算机科学基础知识,为开发者提供了一个全面的技术栈学习平台。

JavaGuide的特点还包括:

  • 全面性:覆盖了Java开发的各个方面,从基础到高级,从理论到实践,应有尽有。
  • 实用性:项目中的内容都是经过精心挑选和整理的,旨在解决实际开发中的常见问题。同时,提供了大量的代码示例和面试题,帮助开发者更好地理解和应用知识。
  • 更新及时:紧跟Java的最新发展,及时更新内容,确保信息的时效性和准确性。
  • 社区支持:JavaGuide是一个开源项目,拥有活跃的社区支持。用户可以在社区中参与贡献、寻求帮助或分享经验。

三、如何学习与使用JavaGuide

  1. 下载与安装:可以从JavaGuide的官方网站或GitHub仓库下载源代码压缩包,或者通过git命令来clone仓库。下载完成后,进入JavaGuide项目的根目录。
  2. 构建与运行:确保系统已经安装了Maven等构建工具,然后执行相应的命令来构建并运行JavaGuide。例如,可以使用“mvn clean package java -jar target/JavaGuide-xxx.jar”命令来运行JavaGuide。
  3. 学习与进阶:无论是Java初学者还是有一定经验的开发者,都可以通过JavaGuide系统地学习和巩固Java及相关技术知识。可以按照JavaGuide的学习路径逐步深入,也可以根据自己的兴趣和需求选择特定的章节进行学习。
  4. 面试准备:JavaGuide中包含了大量的面试题和解析,非常适合正在准备Java相关职位面试的求职者。可以通过学习这些面试题和解析来提高自己的面试技巧和竞争力。
  5. 日常开发参考:JavaGuide中的源码分析和最佳实践部分可以作为日常开发中的参考资料。在遇到问题时,可以查阅JavaGuide中的相关内容来寻找解决方案或灵感。

乐观锁和悲观锁详解

如果将悲观锁(Pessimistic Lock)和乐观锁(PessimisticLock 或 OptimisticLock)对应到现实生活中来。悲观锁有点像是一位比较悲观(也可以说是未雨绸缪)的人,总是会假设最坏的情况,避免出现问题。乐观锁有点像是一位比较乐观的人,总是会假设最好的情况,在要出现问题之前快速解决问题。

什么是悲观锁?

悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程

像 Java 中synchronizedReentrantLock等独占锁就是悲观锁思想的实现。

public void performSynchronisedTask() {
    synchronized (this) {
        // 需要同步的操作
    }
}

private Lock lock = new ReentrantLock();
lock.lock();
try {
   // 需要同步的操作
} finally {
    lock.unlock();
}

高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统的上下文切换,增加系统的性能开销。并且,悲观锁还可能会存在死锁问题(线程获得锁的顺序不当时),影响代码的正常运行。

什么是乐观锁?

乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源(也就是数据)是否被其它线程修改了(具体方法可以使用版本号机制或 CAS 算法)。

在 Java 中java.util.concurrent.atomic包下面的原子变量类(比如AtomicIntegerLongAdder)就是使用了乐观锁的一种实现方式 CAS 实现的。

CAS 算法

CAS 的全称是 Compare And Swap(比较与交换) ,用于实现乐观锁,被广泛应用于各大框架中。CAS 的思想很简单,就是用一个预期值和要更新的变量值进行比较,两值相等才会进行更新。

CAS 是一个原子操作,底层依赖于一条 CPU 的原子指令。

原子操作 即最小不可拆分的操作,也就是说操作一旦开始,就不能被打断,直到操作完成。

CAS 涉及到三个操作数:

  • V:要更新的变量值(Var)
  • E:预期值(Expected)
  • N:拟写入的新值(New)

当且仅当 V 的值等于 E 时,CAS 通过原子方式用新值 N 来更新 V 的值。如果不等,说明已经有其它线程更新了 V,则当前线程放弃更新。

举一个简单的例子:线程 A 要修改变量 i 的值为 6,i 原值为 1(V = 1,E=1,N=6,假设不存在 ABA 问题)。

  1. i 与 1 进行比较,如果相等, 则说明没被其他线程修改,可以被设置为 6 。
  2. i 与 1 进行比较,如果不相等,则说明被其他线程修改,当前线程放弃更新,CAS 操作失败。

当多个线程同时使用 CAS 操作一个变量时,只有一个会胜出,并成功更新,其余均会失败,但失败的线程并不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。

关于 CAS 的进一步介绍,可以阅读读者写的这篇文章:CAS 详解,其中详细提到了 Java 中 CAS 的实现以及 CAS 存在的一些问题。

一、JMM的基本概念

JMM定义了线程之间共享变量的可见性和有序性规则,为开发者提供了一种可靠的同步机制,以避免并发程序中常见的线程安全问题。JMM包含两个主要的内存区域:主内存和工作内存。

  1. 主内存:主内存是所有线程共享的内存区域,包含了程序的全局变量和静态变量。主内存是多个线程之间的交互媒介,线程之间通过主内存进行数据的传递和共享。
  2. 工作内存:工作内存是线程私有的内存区域,包含了线程栈中的局部变量和操作线程栈的操作数栈等。每个线程都有自己独立的工作内存,工作内存存储了线程在执行过程中需要用到的数据。

二、JMM的三大特性

JMM的三大特性是原子性、可见性和有序性,它们共同保证了多线程环境下数据的安全性和一致性。

  1. 原子性(Atomicity)

    • 原子性指的是一个操作要么全部执行成功,要么全部不执行。JMM保证了对基本类型的读写操作的原子性。例如,对一个int类型的变量进行++操作,JMM保证这个操作不会出现读取脏数据或者写入不完整数据的情况。
    • JMM通过使用synchronized关键字、volatile关键字和原子类(如AtomicInteger)等机制来保证原子性。
  2. 可见性(Visibility)

    • 可见性指的是一个线程对一个变量的写操作对其他线程可见。即使在不同的线程中,一个线程对共享变量的修改也能被其他线程立即观察到。
    • JMM通过使用锁机制和内存屏障来实现可见性。例如,使用synchronized关键字对代码块进行同步,每次进入同步块的线程都会从主内存中读取最新的值,保证了可见性。volatile关键字也可以确保被修饰的变量的写操作对其他线程立即可见。
  3. 有序性(Ordering)

    • 有序性指的是在一个线程中的操作顺序与程序代码的顺序一致。然而,在多线程环境下,由于指令重排和缓存一致性等原因,程序的执行顺序可能与代码顺序不一致。
    • JMM通过使用内存屏障来禁止特定类型的指令重排,保证程序的有序性。例如,volatile关键字可以禁止对volatile变量的读/写操作进行指令重排序。

三、JMM的Happens-Before规则

Happens-Before规则是JMM的核心原则之一,用于定义操作之间的顺序关系,基于此关系来保证数据的可见性和一致性。以下是Java中的Happens-Before规则:

  1. 程序顺序规则:在一个线程内,代码的执行顺序按照程序代码的书写顺序。
  2. 监视器锁规则:一个unlock操作在后续对同一锁的lock操作之前。
  3. volatile变量规则:对一个volatile变量的写操作先行发生于后面对该volatile变量的读操作。
  4. 线程启动规则:Thread.start()方法先行发生于此线程的每一个动作。
  5. 线程中断规则:对线程的interrupt()调用先行发生于被中断线程的代码检测到中断事件。
  6. 线程终止规则:线程的所有操作先行发生于此线程的终止检测(Thread.join()返回,Thread.isAlive()返回false)。
  7. 对象终结规则:对象的构造函数执行结束先行发生于finalize()方法的开始。

四、JMM的应用与注意事项

  1. 正确使用volatile关键字:当某个变量在多线程环境下被频繁读取且不需要复杂的同步操作时,可以使用volatile关键字来保证变量的可见性和有序性。
  2. 合理选择synchronized和Lock:在需要对共享资源进行原子操作且需要控制访问顺序时,可以使用synchronized关键字或Lock接口来保证原子性和可见性。
  3. 注意指令重排序的影响:编译器和处理器可能会对指令进行重排序以提高性能,但在多线程环境下,指令重排序可能导致内存可见性问题。因此,在编写多线程程序时,需要特别注意指令重排序的影响,并合理使用内存屏障等机制来保证程序的正确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2203175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HTML】defer 和 async 属性在 script 标签中分别有什么作用?

需要这两个属性的原因? 首先我们要知道的是,浏览器在解析 HTML 的过程中,遇到了 script 元素是不能继续构建 DOM 树的。 它会停止解析构建,首先去下载 js 代码,并且执行 js 的脚本;只有在等到 js 脚本执行…

try、catch、finally、return执行顺序超详解析与throw与throws区别

try、catch、finally、return执行顺序超详解析(针对面试题) 有关try、catch、finally和return执行顺序的题目在面试题中可谓是频频出现。总结一下此类问题几种情况。 写在前面 不管try中是否出现异常,finally块中的代码都会执行&#xff1b…

IPguard与Ping32敏感内容防护能力对比,两款知名防泄密软件对比

在信息安全的新时代,企业面临着日益严重的敏感内容泄露风险。为了保障数据安全,选择合适的防护工具至关重要。IPguard与Ping32作为市场上两款知名的终端管理解决方案,各自具备独特的敏感内容防护能力。本文将对这两者进行深入对比&#xff0c…

kubeadm 搭建k8s 1.28.2版本集群

kubeadm 搭建k8s 1.28.2版本集群 1、kubuadm介绍: kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署: 创建一个Master 节点kubeadm init将Node 节点加入到当前集群中…

minio集群部署

最近接触到minio, 将本地集群部署,分别在ubuntu、centos stream9上进行了搭建,目前看里面的小坑不小,记录以下教程,以备忘、以供他人借鉴。 #### 准备 1、因新版本的minio要求,集群部署必须使用挂载非 roo…

Java基础:字符串详解

1 深入解读String类源码 1.1 String类的声明 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence { }String类是final的&#xff0c;意味着它不能被子类继承&#xff1b;String 类实现了Serializable接口&#xff0c;意味着…

没人告诉你的职场人情世故

看到前同事在群里分享的新年开工遭遇&#xff0c;真是让人感同身受。 第一天就遇到挫折&#xff0c;因为工作做得太快、太早交付&#xff0c;结果反被领导批评&#xff0c;还得重做&#xff0c;头大如斗。这不就提醒我们得时时刻刻记着职场里的那些不成文的规矩吗&#xff1f;…

Hunuan-DiT代码阅读

一 整体架构 该模型是以SD为基础的文生图模型&#xff0c;具体扩散模型原理参考https://zhouyifan.net/2023/07/07/20230330-diffusion-model/&#xff0c;代码地址https://github.com/Tencent/HunyuanDiT&#xff0c;这里介绍 Full-parameter Training 二 输入数据处理 这里…

一、Spring入门

文章目录 1. 课程内容介绍2. Spring5 框架概述3. Spring5 入门案例 1. 课程内容介绍 2. Spring5 框架概述 3. Spring5 入门案例

Java反射专题

目录 一.反射机制 1.Java Reflection 2.反射相关的主要类 3.反射的优缺点 4.反射调用优化—关闭访问检查 二.Class类 1.基本介绍 2.常用方法 3.获取Class对象的方式 4.那些类型有Class对象 三.类加载 1.介绍 2.类加载时机 3.类加载各阶段 四.获取类结构的信息 1…

25.第二阶段x86游戏实战2-背包属性补充

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

机器学习项目——运用机器学习洞察青年消费趋势

1. 项目背景 在21世纪的第三个十年&#xff0c;全球经济和技术的飞速发展正深刻影响着各个领域&#xff0c;尤其是青年消费市场。随着数字化进程的加速&#xff0c;尤其是移动互联网的广泛普及&#xff0c;青年的消费行为和生活方式发生了前所未有的转变。 然而&#xff0c;面对…

开源版GPT-4o来了!互腾讯引领风潮,开源VITA多模态大模型,开启自然人机交互新纪元[文末领福利]

目录 总览 VITA 模型的详细介绍 2.1 LLM 指令微调 2.2 多模态对齐 2.2.1 视觉模态 2.3 音频模态 多模态指令微调 3.1 训练数据 3.1.1 训练过程 模型部署&#xff1a;双工策略 4.1 非唤醒交互 4.2 音频中断交互 评估 5.1 语言表现 5.2 音频表现 5.3 多模态表现 …

离散微分几何中的网格(Meshes)

https://zhuanlan.zhihu.com/p/893338073 一、引言 ![](https://img-blog.csdnimg.cn/img_convert/c5e06e652822e0003cf6be91d26436b7.png) 在离散微分几何的广袤领域中&#xff0c;网格&#xff08;Meshes&#xff09;作为一个核心概念&#xff0c;犹如一座桥梁&#xff0c;…

小灰:从0到年入100万+,从程序员到自由职业者他经历了什么?

这是开发者说的第20期&#xff0c;这次给大家带来的畅销书《漫画算法》作者、自媒体创作者程序员小灰。 小灰做自媒体的时间已经有8年了&#xff0c;目前在全网有60w粉丝&#xff0c;同时《漫画算法》系列和《漫画ChatGPT》的书籍&#xff0c;在全网卖了12万册&#xff0c;靠写…

rocky9 samba共享

1. 安装samba服务&#xff0c;设置开机自启。 2. 创建四个用户user1&#xff0c;user2&#xff0c;sale1&#xff0c;manager&#xff0c;user1&#xff0c;user2属于finance组&#xff0c;sale1属于sales组&#xff0c;manager属于manager组。 3. 建立共享目录/opt/finance_…

模版进阶 非类型模版参数

一.模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成常量来使用。 #i…

打印1000年到2000年之间的闰年

我们要打印1000年到2000年之间的闰年&#xff0c;首先我们先输出1000年到2000年之间的所有的年份&#xff0c;同时我们将闰年的判断方法输入到其中 闰年需要满足下列两个条件的其中之一&#xff1a; 1.能被4整除但不能被100整除 2.能被400整除 打印1000年到2000年之间的闰年…

PCL 贪婪三角投影三角化

目录 一、概述二、代码三、结果 一、概述 PCL中贪婪三角投影三角化的简单使用案例 二、代码 greedy_projection.cpp #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/search/kdtree.h> // for KdTree #include <pcl/features/…

【软件系统架构设计师-案例-1】架构风格

1. 请用200字以内说明系统可靠性的定义及包含的4个子特性&#xff0c;并简要指出提高系统可靠性一般采用哪些技术&#xff1f; &#xff08;1&#xff09;可靠性定义&#xff1a;系统在规定的时间或环境条件下&#xff0c;完成规定功能的能力&#xff0c;就是系统无故障运行的…