首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java Concurrent 线程封闭

就现状而言,差不多有以下几种方式: 1、Ad-hoc 线程封闭 2、ThreadLocal 3、栈封闭 Ad-hoc 线程封闭 Ad-hoc 封闭,靠意念封闭。...然后就有可能实现一个完全没有问题的ad-hoc封闭了,说的真,如果有这个能力还是干点别的吧,别封闭了。这个种方式完全依赖于实现者的控制,但是实际开发基本不可用的一种方式。...具体来说,ThreadLocal 存在一个叫做ThreadLocalMap的结构,数据就在这个结构。...这里相当于完成一次依赖性的转移,GC回收的依据跟map的key没有关系,完全依赖于外部的ThreadLocal引用。 虚线箭头代表弱引用,实线箭头代表强引用。...栈封闭 JVM 中有这么几种内存结构:直接内存(NIO 能够直接操作一部分直接内存)、堆内存、栈内存。其中栈内存是线程私有的,而对内存是线程所共享的。

30630
您找到你想要的搜索结果了吗?
是的
没有找到

Java并发编程之线程封闭

Java语言中,提供了一些类库和机制来维护线程的封闭性,例如局部变量和ThreadLocal类。 实现线程封闭的方法有哪些呢?...1、Ad-hoc线程封闭 Ad-hoc线程封闭是指,维护线程封闭性的职责完全有程序实现来承担。例如可见性修饰符或局部变量,能将对象封闭到目标线程上。事实上对于线程封闭对象通常保存在共有变量。...Ad-hoc线程封闭是非常脆弱的,所以程序尽量少使用它,可以使用以下两种技术(栈封闭,ThreadLocal)。...2、栈封闭封闭也被成为线程内部使用或者线程局部使用,不要与ThredaLocal混淆,比Ad-hoc更易于维护,也更加健壮。在栈封闭,只能通过局部变量才能访问对象。...set = new TreeSet(); } 这样TreeSet对象就被封闭在局部变量,因此也被封闭到执行线程,它位于执行线程的栈,其他线程无法访问这个栈。

81920

JAVA高逼格面试:线程封闭

java的并发编程里,就有一个比较晦涩的名词,叫做线程封闭。在以往的技术交流,经常有人提到这个东西。那它到底是何方神圣,又有什么用的功效呢? 你去搜索一下网络上的文章,都会给你三个选项。...由于它们的祖先,最终只会指向一个线程,所以它们的作用范围就被封闭了。 ? 如上图所示,局部变量和某个线程的关系。java还有个线程执行的内存模型JMM,不过那是对变量的复制和同步,说的不是一回事。...ThreadLocal 其实,java提供给开发者唯一的线程封闭API,就是ThreadLocal。 Thread类,有一个成员变量threadLocals,存放了与本线程相关的所有自定义信息。...对这个变量的定义在Thread,而操作却在ThreadLocal类。...Ad-hoc 这些信息大多来源于《JAVA并发编程》一书。我特地搜索了一下Ad-hoc这个名字的意思。

52910

线程封闭和实例封闭

当某个对象封闭在一个线程时,这种用法将自动实现线程安全性。即使被封闭的对象本身不是线程安全的。 1、栈封闭封闭是线程封闭的一种特例,在栈封闭,只能通过局部变量才能访问对象。...局部变量的固有属性之一就是封闭在执行线程。它们位于执行线程的栈,其他线程无法访问这个栈。...在方法实例化一个TreeSet对象,并将指向该对象的一个引用保存在animals。此时,只有一个引用指向集合animals,这个引用被封闭在局部变量,因此也被封闭在执行线程。...实例封闭: 实例封闭简称“封闭”,当一个对象被封装到另一个对象时,能够访问被封装对象的所有代码路径都是已知的。与对象可由整个程序访问的情况相比,更易于对代码进行分析。...但由于mySet是私有的并且不会溢出,因此ashSet被封闭在PersonSet

1.1K40

(三)Java并发学习笔记--线程封闭

线程封闭 实现好的并发是一件困难的事情,所以很多时候我们都想躲避并发。避免并发最简单的方法就是线程封闭。什么是线程封闭呢? 就是把对象封装到一个线程里,只有这一个线程能看到此对象。...实现线程封闭有哪些方法呢? 1. ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的线程封闭完全靠实现者实现。也是最糟糕的一种线程封闭。所以我们直接把他忽略掉吧。 2....栈封闭封闭是我们编程当中遇到的最多的线程封闭。什么是栈封闭呢?简单的说就是局部变量。多个线程访问一个方法,此方法的局部变量都会被拷贝一分儿到线程栈。...每个线程的对象都对应着Map中一个值,也就是ThreadLocal利用Map实现了对象的线程封闭。这里就不说ThreadLocal的使用方法了,度娘一下便知。...总之,当我们要用线程封闭来避免并发问题的时候,最好使用的就是 【栈封闭】 和 【ThreadLocal】。

18320

java并发之线程封闭(二)

避免并发最简单的方法就是线程封闭。什么是线程封闭呢? 就是把对象封装到一个线程里,只有这一个线程能看到此对象。那么这个对象就算不是线程安全的也不会出现任何安全问题。实现线程封闭有哪些方法呢?...1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的线程封闭完全靠实现者实现。也是最糟糕的一种线程封闭。所以我们直接把他忽略掉吧。 2:栈封闭封闭是我们编程当中遇到的最多的线程封闭。...什么是栈封闭呢?简单的说就是局部变量。多个线程访问一个方法,此方法的 局部变量都会被拷贝一分儿到线程栈。所以局部变量是不被多个线程所共享的,也就不会出现并发问题。...每个线程的对象都对应着Map中一个值,也就是ThreadLocal利用Map实现了对象的线程封闭。这里就不说ThreadLocal的使用方法了,度娘一下便知。...总之,当我们要用线程封闭来避免并发问题的时候,最好使用的就是 【栈封闭】 和 【ThreadLocal】。

22210

Java并发编程:线程封闭和ThreadLocal详解

什么是线程封闭 当访问共享变量时,往往需要加锁来保证数据同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程访问数据,就不需要同步了。这种技术称为线程封闭。...在Java语言中,提供了一些类库和机制来维护线程的封闭性,例如局部变量和ThreadLocal类,本文主要深入讲解如何使用ThreadLocal类来保证线程封闭。...理解ThreadLocal类 ThreadLocal类能使线程的某个值与保存值的对象关联起来,它提供了get、set方法,这些方法为每个使用该变量的线程保存一份独立的副本,因此get总是set当前线程的...ThreadLocal源码解析 来从源码的角度来解析ThreadLocal这个类,这个类存放在java.lang包,这个类有很多方法。 ?...} } 运行该程序,代码输出的结果为: 1 main 10 Thread-0 1 main ThreadLocal常用的使用场景 通常讲JDBC连接保存在ThreadLocal对象

672100

开放-封闭原则

开放-封闭原则:说是软件实体(类、模块、函数等等)应该是可以扩展,但是不可修改的。...这块的意思就比较清楚了,我们在设计软件应该让我们的代码具有同类项的扩展特性,但是同类项的扩展仅仅是扩展而不是多方联系。换句话说对程序的改动是通过增加新代码进行的,而不是改进现有代码。...开放-封闭原则是面向对象设计的核心所在,遵循这个原则可以带来面向对象技术的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员一应该仅对程序中频繁出现的变化做抽象处理。...《大话设计模式-程杰》 考虑以上对于开放封闭原则的描述,我们在代码应该如何实践?首先要有扩展的特性,扩展那么我们势必要抽象接口,然后让类似的类去实现具体的功能,这样一处修改不会牵涉到其他的类。

30610

JAVA线程之ThreadLocal与栈封闭(六)

(一)线程封闭概念 ① 引言 多线程访问共享可变数据,共享变量,涉及到线程间数据同步的问题。一般很多不会去用到共享数据,所以提出了线程封闭的概念。...② 定义 数据都被封闭在各自的线程之中,就不需要同步,也不用考虑线程的安全,这种通过数据封闭在线程而避免使用同步的技术被称为线程封闭。...ThreadLocal threadVar = new ThreadLocal(); 会自动在每个线程上创建一个T的副本,副本之间彼此独立,互不影响,可以用TheadLocal存储一些参数,以便在线程多个方法中使用...(二)栈封闭 就是使用局部变量,局部变量的固有属性之一就是封闭在线程。他们位于执行线程的栈,其他线程无法访问这个栈。...PS:这次说了线程封闭的概念,其实很容易理解只要知道在ThreadLocal是JVM内部维护了一个Map就可以了。栈封闭没有纤细概述,跟局部变量是一个概念。

74030

设计模式(六):开放封闭原则

什么是开放封闭原则? 定义:软件实体如类、模块、函数应该对扩展开放,对修改关闭。 开放封闭原则的主要思想是:当系统需求发生改变时,尽量不修改系统原有代码功能,应该扩展模块的功能,来实现新的需求。...为什么要遵守开放封闭原则?...软件开发过程需求是一定会变化的,所以我们在代码设计的时候要注意代码的稳定性,以减低需求变化带来的不良影响,以便提高系统稳定性和灵活性,而开放封闭原则正是为了处理这些问题而生。...开发过程,之前的设计有他们设计的原因,应尽量避免对原有代码的修改。 开放封闭原则的实现方法 1、抽象约束 抽象层不易变化,只要抽象得合理,就可以保持系统架构的稳定性。...封装变化有以下两个指导原则: 将相同的变化因素封装到一个接口或抽象类; 将不同的变化因素封装到不同的接口或抽象类; 往期文章: 《设计模式(一):单一职责原则》 《设计模式(二):里氏替换原则》 《

1.3K21

设计模式(六):开放封闭原则

什么是开放封闭原则? 定义:软件实体如类、模块、函数应该对扩展开放,对修改关闭。 开放封闭原则的主要思想是:当系统需求发生改变时,尽量不修改系统原有代码功能,应该扩展模块的功能,来实现新的需求。...为什么要遵守开放封闭原则?...软件开发过程需求是一定会变化的,所以我们在代码设计的时候要注意代码的稳定性,以减低需求变化带来的不良影响,以便提高系统稳定性和灵活性,而开放封闭原则正是为了处理这些问题而生。...开发过程,之前的设计有他们设计的原因,应尽量避免对原有代码的修改。 开放封闭原则的实现方法 1、抽象约束 抽象层不易变化,只要抽象得合理,就可以保持系统架构的稳定性。...封装变化有以下两个指导原则: 将相同的变化因素封装到一个接口或抽象类; 将不同的变化因素封装到不同的接口或抽象类; 往期文章: 《设计模式(一):单一职责原则》 《设计模式(二):里氏替换原则》 《

1.4K30

Java并发编程学习4-线程封闭和安全发布

当某个对象封闭在一个线程时,这种用法将自动实现线程安全性,即使被封闭的对象本身不是线程安全的。在Java中使用线程封闭技术有:Swing 和 JDBC 的 Connection 对象。...1.2 栈封闭封闭是线程封闭的一种特例(它也被称为线程内部使用或线程局部使用),在栈封闭,只能通过局部变量才能访问对象。...因为局部变量的固有属性之一就是封闭在执行线程,它们位于执行线程的栈,其他线程无法访问这个栈。因此栈封闭比 Ad-hoc 线程封闭更易于维护,也更加健壮。...虽然在 Java 语言规范和 Java 内存模型中都没有给出不可变性的正式定义,但不可变性并不等于将对象的所有域都声明为 final 类型,即使对象中所有的域都是 final 类型的,这个对象也仍然可能是可变的...在 Java 内存模型,final 域能确保初始化过程的安全性,从而可以不受限制地访问不可变对象,并在共享这些对象时无须同步。

18221

Android,开源还是封闭

前几天,我就在网志上写了自己的担忧: "首先,Android应用程序只能用java语言开发,莫非所有的应用程序都运行在一个巨大的虚拟机上?...(【更正】网友留言指出,2009年6月Android发布NDK工具包,支持C/C++语言编程,不过性能不如SKD工具包Java语言。...Linux Kernel的维护者Greg Kroah-Hartman宣布,将Android 代码从 Linux kernel 代码库删除。...而ASL许可证规定,可以随意使用源码,不必开源,所以建筑在Android之上的硬件驱动和应用程序,都可以保持封闭。...这次在 2.6.33 主线把 Android 部分清理掉是由于厂商贡献的这部分代码在离开 Google 的代码树之后对其他嵌入式 Linux 没有用处,干脆从主线除掉好了......

65970
领券