【Java】Java核心要点总结:62

news2024/10/7 12:27:01

文章目录

  • 1. 线程中的线程是怎么创建的,是一开始就随着线程池的启动创建好的吗?
  • 2. 既然Volatile能够保证变量的可见性,是否意味着基于其的运算是并发安全的
  • 3. ThreadLoadl是什么 有哪些使用场景
  • 4. ThreadLoadl是怎么解决并发安全的
  • 5. 有人说要慎用ThreadLoadl,why
  • 6. 为什么代码会重排序,有什么解决策略


在这里插入图片描述

1. 线程中的线程是怎么创建的,是一开始就随着线程池的启动创建好的吗?


线程中的线程通常是通过在父线程中创建新的Thread对象并将其加入线程池中实现的。当然,这个过程也可以通过一些其他的方式来实现,比如使用ExecutorService.submit()方法提交一个Callable或Runnable任务。

在Java中,线程池是在应用程序启动时就会被创建的。线程池中的线程数量可以事先配置好或动态地调整,以适应不同场景下的需求。在线程池启动之后,一些线程对象就会被创建,并被分配给线程池进行任务处理。当一个任务被提交到线程池时,线程池会从可用的线程中选取一个线程来执行该任务。

需要注意的是,线程池中的线程一般都是守护线程,即在所有的用户线程结束后,会随着应用程序的结束而自动停止。


2. 既然Volatile能够保证变量的可见性,是否意味着基于其的运算是并发安全的


虽然volatile关键字能够保证变量的可见性,即对一个volatile变量的修改一定会被其他线程所立即看到,但是它并不能保证对这个变量的读取和写入操作是原子性的

因此,在多线程环境下,如果要对一个volatile变量进行多个操作,例如自增或自减等非原子性操作,仍需要使用额外的手段来保证这些操作的原子性。具体而言,可以使用Java中提供的atomic包中的类,比如AtomicInteger、AtomicLong等,或者使用锁等同步机制来保证对共享变量的访问是原子性的。

尽管volatile变量能够保证可见性,但是对其进行复合操作时仍然需要提供额外的线程安全保证。


3. ThreadLoadl是什么 有哪些使用场景


ThreadLocal是Java中一个线程级别的变量隔离工具,它允许在多线程环境下安全地访问一个可变的变量。简单而言,ThreadLocal为每个线程提供了一个独立的变量副本,使每个线程都可以独立地改变自己所拥有的变量副本,而不会影响其他线程所拥有的副本。

ThreadLocal适用于需要处理线程之间共享的数据,但又不希望使用传统的同步机制(比如synchronized)来进行保护的情况。举几个例子:

  1. 数据库连接管理
    在多线程环境下,由于数据库连接是一种共享的资源,因此需要对其进行线程安全保证。使用ThreadLocal技术可以为每个线程分配一个独立的数据库连接,从而避免了多线程并发竞争读写同一个数据库连接的问题。

  2. SimpleDateFormat对象
    SimpleDateFormat是Java中一个常用的日期格式化工具类,它的实例通常被设计成多线程共享的,但是如果使用不当,会导致线程安全问题。使用ThreadLocal可以为每个线程分配一个独立的SimpleDateFormat实例,从而避免了多个线程互相干扰修改同一个SimpleDateFormat实例所带来的线程安全问题。

  3. 用户登录信息
    在Web应用中,用户登录信息通常被保存在Session中,而Session的生命周期会持续整个会话。使用ThreadLocal可以将Session信息保存在每个线程所对应的ThreadLocal对象中,从而避免多线程并发访问Session引发的线程安全问题。

需要指出的是,尽管ThreadLocal可以提供一种有效的线程级别的变量隔离方案,并且被广泛应用于各种场景中,但是如果使用不当,在性能和资源浪费等方面仍然存在一些潜在的问题。因此,在使用ThreadLocal时需谨慎考虑其实际应用场景,并根据具体情况进行针对性的优化。


4. ThreadLoadl是怎么解决并发安全的


ThreadLocal能够做到线程级别的变量隔离,从而避免多个线程之间对同一个变量的并发访问所可能带来的并发安全问题。其内部实现机制主要是通过为每个线程维护一个独立的变量副本。

当一个线程需要使用ThreadLocal变量时,它首先会根据ThreadLocal对象的HashCode值在自己的Thread内部查找对应的变量副本。如果当前线程不存在对应的副本,则会创建一个新的副本,并将它与当前线程关联起来;如果存在对应的副本,则直接返回该副本。这样,就可以保证每个线程都操作自己的变量副本,不会影响其他线程所拥有的副本。

另外需要注意的是,尽管ThreadLocal可以避免多个线程同时访问同一个变量的并发安全问题,但仍有可能出现单个线程内部的并发安全问题。因此,在使用ThreadLocal时,也需要考虑线程内部的并发安全问题,比如多个线程同时写入ThreadLocal变量所导致的覆盖问题等。为了避免这种情况,可以使用诸如ConcurrentHashMap等线程安全的数据结构或者同步机制来对ThreadLocal变量进行额外的加锁和同步操作。

ThreadLocal可以通过线程级别的变量隔离机制,避免多个线程之间对同一个变量的并发访问所可能带来的并发安全问题。同时,在实际使用中也需要注意线程内部的并发安全问题,从而保证程序在多线程环境下的稳定和正确性。


5. 有人说要慎用ThreadLoadl,why


虽然ThreadLocal这个技术在某些场景下能够提供一种有效的线程级别的变量隔离方案,但同时也存在一些问题和限制,因此需要慎重使用:

1.内存泄漏风险

ThreadLocal为每个线程都创建了一个变量副本,如果不及时地清理副本,就容易导致内存泄漏。比如在Web应用中,如果将Web请求与ThreadLocal关联,在没有手动清理关联的情况下,可能会导致大量无效的ThreadLocal副本得不到回收,从而造成内存泄漏。

2.并发性能问题

由于每个线程都有自己的ThreadLocal副本,因此在线程数量较多或者是创建的副本对象较大时,容易造成内存资源占用过多和启动时长过长的问题。此外,由于ThreadLocal的实现方式和并发工具类之间通常需要进行复杂的交互和同步,也会对程序的并发性能造成一定的影响。

3.代码可读性问题

使用ThreadLocal使得代码变得更加复杂和难以阅读,因为它会隐藏线程间变量传递、状态共享等多线程编程相关的细节。如果滥用ThreadLocal,可能会使程序的代码结构变得笨重、不优雅,从而降低代码的可读性和易维护性。

ThreadLocal是一种可以创造性地解决并发问题的技术,但如何正确使用它,需要根据具体场景进行优化选择,并且需要注意内存泄漏、并发性能、可读性等方面的问题。在编写多线程程序时,我们需要根据具体业务需求,量力而行,权衡利弊,谨慎使用ThreadLocal。


6. 为什么代码会重排序,有什么解决策略


代码重排序是CPU和编译器所做的一种优化,在不改变语义的情况下重新排列程序执行顺序,以提高代码执行效率。但是,如果代码重排序处理不当,有可能导致程序出现问题,比如数据竞争、多线程死锁等。

通常情况下,编译器会根据一定的规则对代码进行重排序,例如指令的依赖关系、内存屏障等。在多线程环境中,由于线程之间的交换机制和数据共享需要保证原子性和可见性,因此代码重排序可能会给多线程带来很多隐患。

解决策略

1.使用volatile

可以将某些变量设置为volatile类型,确保变量的写入操作能够及时地对其他线程可见,防止重排序引起的数据不一致问题。

2.使用同步机制

可以通过使用synchronized或者Lock等同步机制,确保临界区内的代码串行执行,防止重排序引起的数据竞争和内存屏障问题。

3.使用原子类

Java提供了一些原子操作对象,例如AtomicInteger、AtomicLong等,这些对象提供了比锁更快速、安全的方式来实现多线程环境下的变量修改操作。

4.使用ThreadLocal

ThreadLocal可以为每个线程提供一个独立的变量副本,从而避免多线程间共享变量的问题,从而可以避免由重排序引起的数据不一致问题。

5.使用禁止指令重排序的特殊注释

Java提供了一些特殊的注释,例如@Contended、@sun.misc.Contended等,这些注释可以禁止指定字段的指令重排序,从而避免重排序执行带来的潜在风险。

在编写多线程程序时,需要认真研究代码重排序规则,保证程序的正确性和效率。采用合适的解决策略,合理选择代码重排序方式,确保程序的高效、稳定运行。



在这里插入图片描述

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

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

相关文章

WPF开发txt阅读器3:目录控件

文章目录 目录提取列表控件整改 txt阅读器系列: 需求分析和文件读写目录提取类💎列表控件与目录 目录提取 在实现标题类之后,就可以实战演习一番。首先在mainWindow中添加Catalog类 public Catalog catalog;然后更改 然后在标题栏中添加…

【高危】泛微 e-cology9 存在任意用户登录漏洞

漏洞描述 泛微协同管理应用平台(e-cology)是一套企业大型协同管理平台。 泛微e-cology9部分版本中存在前台任意用户登录漏洞,由于系统默认配置固定密钥进行用户身份验证。 当存在/mobile/plugin/1/ofsLogin.jsp文件时(可能通过插件方式安装&#xff0…

TCP/IP详解(一)

TCP/IP协议是Internet互联网最基本的协议,其在一定程度上参考了七层OSI(Open System Interconnect,即开放式系统互联)模型 OSI参考模型是国际组织ISO在1985年发布的网络互联模型,目的是为了让所有公司使用统一的规范来…

基于stata的DID平行趋势检验

前言 DID平行趋势检验定义 定义:评估两变量数据之间是否会存在某种同幅度增减情况的相关关系检验方法 重要性:为何要做平行趋势检验?平行趋势检验在DID模型中是非常重要的一步,用于验证处理组和对照组在干预前的趋势是否平行。只…

微信服务商快速进件,商户自己提交资料,减少工作量

大家好,我是小悟 用好技术,让经营更高效。为了减少服务商工作量,移动端服务商进件来了,分为移动端和管理端。 移动端 包括四大模块,主体资料、经营资料、法人资料和银行账户。 点击顶部步骤条可以切换,…

在IDE中使用altair无法显示绘图结果

同学们以及熟悉Pycharm编辑运行python代码。正如文章末尾给出的pycharm运行altair的建议方法视觉效果一般。 因为数据可视化在IDE实现效果不理想,这是因为altair使用Vega和Vega-Lite语法来创建交互式图表,而IDE无法直接渲染这些图表。 习惯了pycharm的同学是时候考虑…

Java开发手册中为什么禁止使用BigDecimal的equals方法做等值比较以及为什么禁止使用double直接构造BigDecimal

场景 阿里Java开发手册嵩山版中明确指出: 1、BigDecimal的等值比较应使用compareTo()方法,而不是equals()方法 equals()方法会比较值和精度(1.0与1.00返回结果为false),而compareTo()则会忽略精度 2、禁止使用构造方法BigDeci…

深度学习简介

什么是深度学习? 一、深度学习–神经网络简介 深度学习(Deep Learning)(也称为深度结构学习【Deep Structured Learning】、层次学习【Hierachical Learning】或者 深度机器学习【Deep Machine Learning】)是一类算法…

CSDN送了我一本书:《写作脑科学》| 记我与写博客

文章目录 收到之前收到之后番外——我与写博客从日记开始写博客至今 收到之前 CSDN有个深读计划的活动,在报名者中抽取一些小伙伴免费送书,但是收到书籍后需要写一篇书评,否则不能继续参加下次的活动。要求写书评可能是出版社或作者希望可以…

Little’s Law 利特尔法则

1 A simple definition: Little’s Law states that the long-term average number of customers in a stable system L L L is equal to the long-term average effective arrival rate, λ \lambda λ, multiplied by the average time a customer spends in the system, …

ISO21434 网络安全验证(八)

目录 一、概述 二、目标 三、输入 3.1 先决条件 3.2 进一步支持信息 四、要求和建议 五、输出 一、概述 本条款描述了该项目的车辆级别的网络安全验证活动。该项目被考虑在车辆层面的操作环境以及系列生产的配置。 二、目标 本条款的目的是: 验证网络安全目…

软考A计划-系统架构师-官方考试指定教程-(4/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

建议收藏:超详细ChatGPT(GPT 4.0)论文润色指南+最全提示词/咒语

在这篇文章中,我将分享如何利用ChatGPT 4.0辅助论文写作的技巧,并根据网上的资料和最新的研究补充更多好用的咒语技巧。 本篇文章持续更新,祝大家写作顺利,如果对你有帮助,记得三连! 欢迎大家在评论区补充…

switch语句详细逆向分析

首先需要明确一点switch语句在游戏当中至关重要,而且基本都会使用它来提高效率! 因为我们在找call的时候,如果能够识别出来switch语句,只要找到一个call,后面的就都搞定了 switch:case必须是整数&#xf…

C#,码海拾贝(37)——求解“托伯利兹方程组“的“列文逊方法“之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…

【高危】Linux kernel Netfilter UAF漏洞(POC公开)

漏洞描述 Netfilter 是 Linux kernel 的一个子系统&#xff0c;用于提供网络数据包过滤和网络地址转换功能。 Linux kernel 6.3.1及之前版本中&#xff0c;当 Netfilter 处理批量请求以更新 nf_tables 配置时&#xff0c;由于对匿名集合的操作处理不当会导致use-after-free&a…

【Java】Java核心要点总结:61

文章目录 1. java中的线程池是如何实现的2. 创建线程池的几个核心参数3. Java 中线程池的执行流程4. 为什么要使用线程池5. 线程池的拒绝策略 1. java中的线程池是如何实现的 Java 中的线程池是通过 ThreadPoolExecutor 类实现的。ThreadPoolExecutor 继承自 AbstractExecutorS…

chatgpt赋能python:如何快速复制Python库到其他电脑

如何快速复制Python库到其他电脑 作为一名拥有10年Python编程经验的工程师&#xff0c;我深知Python库在项目开发中扮演着非常重要的角色。Python库能够帮助我们快速实现功能、减少重复工作以及提高代码质量。但是&#xff0c;在换电脑或在新的团队合作时&#xff0c;我们常常…

【PWN · ret2libc | Canary】[2021 鹤城杯]littleof

最近比较忙&#xff0c;这道题用了好长时间来debug&#xff0c;甚至贡献了第一次在csdn上提问。。。 目录 前言 一、题目重述&思路分析 二、exp 三、Canary 四、萌新遇到的困难 总结 前言 Canary作为经典且基本的栈保护措施&#xff0c;在后期的题目中必然是基本标…

STL——string模拟实现(一)

目录 构造函数的实现 拷贝构造 赋值重载 const问题 迭代器打印 范围for打印 运算符重载 reserve模拟 插入数据 push_back append 构造函数的实现 先贴出一段错误代码&#xff1a; #include<iostream> #include<assert.h> namespace zzl//避免与库冲突 {…