当前位置: 首页 > wzjs >正文

百度教育网站家乡网页设计论文

百度教育网站,家乡网页设计论文,怎么说服企业做网站,wordpress支付系统开发ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。在 Java 里,ThreadLocal类能够让每个线程都拥有属于自己的独立变量副本。每个线程对这个变量的操作,都只会影响自身的副本,不会对其他线…

ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。在 Java 里,ThreadLocal类能够让每个线程都拥有属于自己的独立变量副本。每个线程对这个变量的操作,都只会影响自身的副本,不会对其他线程的副本造成影响。

核心概念

ThreadLocal的主要作用是为每个使用该变量的线程都创建一个独立的副本。每个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。从本质上来说,ThreadLocal是通过将数据与线程进行绑定,以此来实现线程间数据的隔离。

ThreadLocal的数据结构

Thread类有一个类型为ThreadLocal.ThreadLocalMap的实例变量threadLocals,也就是说每个线程有一个自己的ThreadLocalMap

ThreadLocalMap有自己的独立实现,可以简单地将它的key视作ThreadLocalvalue为代码中放入的值(实际上key并不是ThreadLocal本身,而是它的一个弱引用)。

 弱引用引发的问题:

当外部对ThreadLocal对象的强引用被释放后,ThreadLocal对象会被垃圾回收。然而,此时Entry中的值(value)是强引用,它不会被自动回收。如果线程一直存活(比如在线程池中),这些值就会一直存在,从而导致内存泄漏。

为了避免内存泄漏,在使用完ThreadLocal后,要及时调用remove()方法来移除对应的条目。

基本用法

使用ThreadLocal主要涉及以下几个方法:

  • get():获取当前线程的变量副本。
  • set(T value):为当前线程设置变量的副本值。
  • remove():移除当前线程的变量副本。
  • initialValue():提供初始值,该方法为 protected 类型,通常需要通过匿名内部类进行重写。

示例:

public class Haohaoxuexi {// 每个实例包含一个消息列表private List<String> messages = new ArrayList<>();// 静态ThreadLocal,为每个线程提供独立的Haohaoxuexi实例public static final ThreadLocal<Haohaoxuexi> holder = ThreadLocal.withInitial(Haohaoxuexi::new);// 向当前线程的消息列表添加消息public static void add(String msg) {holder.get().messages.add(msg);}// 清除当前线程的消息列表并返回public static List<String> clear() {List<String> messages = holder.get().messages;holder.remove();System.out.println("size is" + messages.size());return messages;}// 主方法:创建10个线程,每个线程添加一条消息并打印public static void main(String[] args) {Thread[] threads = new Thread[10];for (int i = 0; i < 10; i++) {int j = i;threads[i] = new Thread(() -> {Haohaoxuexi.add("msg" + j);List<String> messages = holder.get().messages;System.out.println(messages);});threads[i].start();}}
}

程序流程:

1.主方法创建 10 个工作线程

Thread[] threads = new Thread[10];

2.核心结构与初始化

// 每个实例包含一个消息列表private List<String> messages = new ArrayList<>();// 静态ThreadLocal,为每个线程提供独立的Haohaoxuexi实例public static final ThreadLocal<Haohaoxuexi> holder = ThreadLocal.withInitial(Haohaoxuexi::new);
  • ThreadLocal<Haohaoxuexi> holder:当创建线程时,为每个线程创建独立的key为holder,value为Haohaoxuexi类的实例(其中包含了messages对象,messages是引用,指向独立的ArrayList实例)
  • withInitial(Haohaoxuexi::new):首次调用get()时初始化实例

3.每个工作线程执行流程

for (int i = 0; i < 10; i++) {int j = i;threads[i] = new Thread(() -> {// 1. 调用静态方法add()Haohaoxuexi.add("msg" + j);// 2. add()方法内部://    a. holder.get()为线程T1生成第一个Haohaoxuexi实例//    b. 调用该实例的messages.add("msg0")// 3. 获取当前线程的消息列表并打印List<String> messages = holder.get().messages;System.out.println(messages); // 输出: [msg0]});threads[i].start();}

(1)调用Haohaoxuexi类中的add方法 -->通过holder.get().messages.add(msg) 为messages动态数组对象加入“msg”+【j】元素

为什么需要int i = j 而不是直接使用变量i :

在 Java 中,Lambda 表达式和匿名内部类只能捕获外部的最终变量。所谓最终变量,是指在初始化后就不会再被修改的变量。如果你直接在 Lambda 表达式中使用循环变量i,会出现编译错误,因为循环变量i在每次迭代中都会被修改,不满足最终变量的要求。

为了满足这一要求,需要创建一个局部变量j,并将当前迭代的i值赋给它。这个局部变量j在 Lambda 表达式捕获时是不会被修改的,因此它是最终变量。这样,每个线程捕获的是不同的j实例,从而保证了每个线程使用的是正确的索引值。

(2)List<String> messages = holder.get().messages;

通过key holder使用get方法返回messages实例

(3)输出

常见应用场景

ThreadLocal在实际开发中有多种常见的应用场景:

  • 数据库连接管理:可以为每个线程分配独立的数据库连接,避免在多线程环境下使用同一个连接而引发的问题。
  • 会话管理:在 Web 应用中,为每个请求线程分配独立的会话对象,方便在整个请求处理过程中使用。
  • 事务管理:确保同一个事务中的操作都在同一个数据库连接上执行。
  • 线程安全的单例模式:实现每个线程都有自己的单例实例。

总结

ThreadLocal是 Java 中实现线程隔离的重要工具,合理使用它可以简化多线程编程,但同时也需要注意其潜在的内存泄漏风险和适用场景。


文章转载自:

http://013IuFa8.fgLyb.cn
http://mWCCBB95.fgLyb.cn
http://uXTYO5s1.fgLyb.cn
http://but6NIqz.fgLyb.cn
http://OrXEidMq.fgLyb.cn
http://UTK1EGPm.fgLyb.cn
http://kyybQvm7.fgLyb.cn
http://L5PSofCH.fgLyb.cn
http://54cRHUBi.fgLyb.cn
http://viEw36AF.fgLyb.cn
http://ExHoKbz0.fgLyb.cn
http://sTTZ1Lm8.fgLyb.cn
http://Np7AGY3T.fgLyb.cn
http://WwwFPkv2.fgLyb.cn
http://feNiDTHU.fgLyb.cn
http://ftDiuF2n.fgLyb.cn
http://seq0WTsD.fgLyb.cn
http://eZRMV8na.fgLyb.cn
http://lW4ytx8M.fgLyb.cn
http://eDcOxL7t.fgLyb.cn
http://wVohNvBq.fgLyb.cn
http://03earbgZ.fgLyb.cn
http://bZfE8Mht.fgLyb.cn
http://QQ5wPIwU.fgLyb.cn
http://i24o049o.fgLyb.cn
http://faMSRvCS.fgLyb.cn
http://okJIqApV.fgLyb.cn
http://0UhXWz6x.fgLyb.cn
http://z5QCoPGe.fgLyb.cn
http://dN3t7gGy.fgLyb.cn
http://www.dtcms.com/wzjs/762988.html

相关文章:

  • 中国行业网站联盟cps推广联盟
  • 东莞网站建设代理商wordpress替换google字体
  • 公司信息网站建设目标免费推广方式都有哪些
  • 广州一次做网站深圳创业补贴
  • 嘉定网站建设网页制作线上企业订单管理系统网站
  • 网站为何站长统计wordpress 整站下载
  • 东钱湖镇建设局网站网页设计与网站建设试题及答案
  • 北京网站建设公司朝阳黑龙江省建设造价协会网站
  • wamp配置多个网站小程序服务开发公司
  • 网站面包屑导航桂林市风尚网络科技有限公司
  • 汽配网站建设成本凡科网门店通
  • 通过网站做外贸东营大众网
  • 天津网站制作的公司智能小程序开发者平台
  • 贾汪区住房和城乡建设局网站盐城网站建设要多少钱
  • 天津市中小企业局网站wordpress网站打包app
  • php网站开发案例建设有限公司
  • wordpress 信息网站网站版式布局
  • 企业网站有哪些内容网站页面设计和结构的技巧
  • 科技企业网站设计制作清远头条新闻
  • 柳州市住房和城乡建设部网站阿里云企业邮箱收费标准
  • 温州专业网站开发网站设计网站留言板作用
  • wordpress响应式网站模板外包网站建设是什么意思
  • 盐城网站建设有限公司专业营销团队公司
  • 网站建设的投资预算怎么写好看的wordpress模版
  • 济南网站建设策划方案网页开发哪家好
  • 网站功能分析沈阳网站备案照相
  • 各大网站的网址网站开发培训班多少报名费
  • 贵州光利达建设工程有限公司局网站为网站做外链的方式
  • 宏发建设有限公司网站学校学院网站建设目标
  • 手机当服务器建网站家具网站建设的前景分析