Entry

【转载】Java中的多线程超详细的总结

夙愿已清 提交于 2021-01-13 19:56:10
引 如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。 很多人都对其中的一些概念不够明确,如同步、并发等等,让我们先建立一个数据字典,以免产生误会。 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程 并行与并发: 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。 并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。 并发与并行 线程安全:经常用来描绘一段代码。指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,cpu是不是够用即可。反过来,线程不安全就意味着线程的调度顺序会影响最终结果,如不加事务的转账代码: void transferMoney(User from, User to, float amount){ to

webpack4基础

六月ゝ 毕业季﹏ 提交于 2021-01-13 19:03:23
原文链接: webpack4基础 webpack4基础 鉴于一些大牛的提醒,我把此文改成,基础的webpack,提供给像我一样的刚进入webpack的小白们。 首先webpack4建议使用 node版本在8.5以上 ,cmd中 node -v 查看node版本。 1.什么是webpack WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其打包为合适的格式以供浏览器使用。 构建就是把源代码转换成发布到线上的可执行 JavaScrip、CSS、HTML 代码,包括如下内容。 代码转换 :TypeScript 编译成 JavaScript、SCSS 编译成 CSS 等。 文件优化 :压缩 JavaScript、CSS、HTML 代码,压缩合并图片等。 代码分割 :提取多个页面的公共代码、提取首屏不需要执行部分的代码让其异步加载。 模块合并 :在采用模块化的项目里会有很多个模块和文件,需要构建功能把模块分类合并成一个文件。 自动刷新 :监听本地源代码的变化,自动重新构建、刷新浏览器。 代码校验 :在代码被提交到仓库前需要校验代码是否符合规范,以及单元测试是否通过。 自动发布 :更新完代码后,自动构建出线上发布代码并传输给发布系统。 构建其实是工程化

彻底理解ThreadLocal

邮差的信 提交于 2021-01-13 17:36:27
ThreadLocal是什么   早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。   当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。   从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。   所以,在Java中编写线程局部变量的代码相对来说要笨拙一些,因此造成线程局部变量没有在Java开发者中得到很好的普及。 ThreadLocal的接口方法 ThreadLocal类接口很简单,只有4个方法,我们先来了解一下: void set(Object value)设置当前线程的线程局部变量的值。 public Object get()该方法返回当前线程所对应的线程局部变量。 public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。 protected

面试真题-----hashMap原理

ぃ、小莉子 提交于 2021-01-12 04:37:24
HashMap详解 JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等 简介 Java为数据结构中的映射定义了一个接口java.util.Map HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null 。非线程安全。 如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是 它承自Dictionary类 。线程安全。并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。 LinkedHashMap:LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。 TreeMap:TreeMap实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器

Java服务器内存过高&CPU过高问题排查

*爱你&永不变心* 提交于 2021-01-11 03:20:07
一、内存过高 1、内存过高一般有两种情况:内存溢出和内存泄漏 (1)内存溢出:程序分配的内存超出物理机的内存大小,导致无法继续分配内存,出现OOM报错 (2)内存泄漏:不再使用的对象一直占据着内存不释放,导致这块内存浪费掉,久而久之,内存泄漏的对象堆积起来,也会导致物理机的内存被耗尽,出现OOM报错 2、内存过高的检测办法:通常我们的Java服务器部署在Linux机器上面,可以通过jvm自带的命令进行一些检测 (1)查看对象的数目和占用内存大小 ①参数为Java程序的进程号,将结果导出到指定目录中, jmap -histo:live <进程号> > <导出目录+文件名> ②示例如下,可以看到程序中各个对象所占用内存的情况,根据占用字节数大小降序显示,这里只能看出哪些对象占用内存高,但是还不能具体定位到问题代码,需要进一步排查 ③一些特殊的标识的含义 [C 表示char[],一般与String对象相关,因为String其实就是基于char数组实现的 [S 表示short[] [I 表示int[] [B 表示byte[] [II 表示int[][] num #instances #bytes class name ---------------------------------------------- 1 : 585152 75635896 [C 2 : 66541

「学习笔记」深入理解ThreadLocal

会有一股神秘感。 提交于 2021-01-10 00:29:06
目录 一 引言 二 源码解析 三 案例 四 总结 一 引言 ThreadLocal的官方API解释为: * This class provides thread-local variables. These variables differ from * their normal counterparts in that each thread that accesses one (via its * {@code get} or {@code set} method) has its own, independently initialized * copy of the variable. {@code ThreadLocal} instances are typically private * static fields in classes that wish to associate state with a thread (e.g., * a user ID or Transaction ID). 这个类提供线程局部变量。这些变量与正常的变量不同,每个线程访问一个(通过它的get或set方法)都有它自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,希望将状态与线程关联(例如,用户ID或事务ID)。 1

LinkedList 双向循环链表和双向链表的区别

廉价感情. 提交于 2021-01-10 00:21:33
从JDK1.7开始,LinkedList 由双向循环链表改为双向链表 首先,简单介绍一下LinkedList: LinkedList是List接口的双向链表实现。由于是链表结构,所以长度没有限制;而且添加/删除元素的时候,只需要改变指针的指向(把链表断开,插入/删除元素,再把链表连起来)即可,非常方便,而ArrayList却需要重整数组 (add/remove中间元素)。所以LinkedList适合用于添加/删除操作频繁的情况。 在JDK 1.7之前(此处使用JDK1.6来举例),LinkedList是通过headerEntry实现的一个循环链表的。先初始化一个空的Entry,用来做header,然后首尾相连,形成一个循环链表: 在LinkedList中提供了两个基本属性size、header。 private transient Entry<E> header = new Entry<E>( null , null , null ); private transient int size = 0; 其中size表示的LinkedList的大小,header表示链表的表头,Entry为节点对象。 1 private static class Entry<E> { 2 E element; // 元素节点 3 Entry<E> next; // 下一个元素 4 Entry<E>

java面试突击-java基础(整理自面试宝典)

99封情书 提交于 2021-01-09 21:50:42
Java 基础 1.1 Collection 和 Map (1)掌握 Collection 和 Map 的继承体系。 ArrayList 和 LinkList 的区别 ArrayList (数组结构): 优点:get 和 set 调用花费常数时间,也就是查询的速度快; 缺点:新项的插入和现有项的删除代价昂贵,也就是添加删除的速度慢 LinkedList (链表结构): 优点:新项的插入和和现有项的删除开销很小,即添加和删除的速度快 缺点:对 get 和 set 的调用花费昂贵,不适合做查询 ==面试中经常问到一些深入的东西,比如:== 是否保证线程安全 : ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; 底层数据结构 : Arraylist 底层使用的是 Object 数组;LinkedList 底层使用的是双向循环链表数据 结构; 插入和删除是否受元素位置的影响 : ① ArrayList 采用数组存储,所以插入和删除元素的时间复 杂度受元素位置的影响。 比如:执行 add(E e)方法的时候, ArrayList 会默认在将指定的元素追加到此 列表的末尾,这种情况时间复杂度就是 O(1)。 但是如果要在指定位置 i 插入和删除元素的话(add(intindex, E element))时间复杂度就为 O(n-i)。

ThreadLocal探究

折月煮酒 提交于 2021-01-09 21:47:37
ThreadLocal 是JDK给我们提供的一个工具类,通过该类提供的方法可以操作变量,每个线程往ThreadLocal 中读写数据是线程隔离的,操作的都是线程本地内存里的变量,从而避免了线程安全的问题。 下面这段程序创建了一个ThreadLocal 对象countTL,重写了方法initialValue(当我们调用get方法时,如果还没有通过set方法设置值,它会返回initialValue方法的返回值)。在main方法里启动了两个线程,两个线程在循环里分别调用了increase方法,increase方法首先通过countTL.get()获取变量,然后++,在调用set方法设置新的值。 public class ThreadLocalDemo { private static final ThreadLocal<Integer> countTL = new ThreadLocal<Integer>() { protected Integer initialValue() { return new Integer(0); } ; }; public int increase() { //如果未执行set方法初始值为initialValue返回的值 Integer value = countTL.get(); value++; //设置值 countTL.set(value);

MIT 6.828

▼魔方 西西 提交于 2021-01-09 17:17:48
[TOC] 实验总结 本次实验用时约八个小时。 收获是对线性地址的理解更深入了。 遇到的困难包括: 懒。 xv6-riscv 默认开了 kpti(内核和用户态页表分离) ,故需要在各种系统调用头部手动模拟 traverse 页表的过程,以及模拟处理缺页异常。(我现在觉得这不是一个很好的设计) 测试结果: $ make grade running lazytests: (3.7s) lazy: pte printout: OK lazy: map: OK lazy: unmap: OK usertests: (95.8s) usertests: pgbug: OK usertests: sbrkbugs: OK usertests: argptest: OK usertests: sbrkmuch: OK usertests: sbrkfail: OK usertests: sbrkarg: OK usertests: stacktest: OK usertests: all tests: OK Score: 100/100 0. 实验准备 实验指导链接 上来直接: $ cd xv6-riscv-fall19 $ git checkout lazy 实验分为四个子任务(实际更多个): 设计一个输出页表的调试程序 vmprint(pagetable_t) 。 实现不立即分配内存的