08 2020 档案

摘要:永久代 在自定义类加载器还不是很常见的时候,类大多是static的,很少被卸载或收集,因此被成为“永久的(Permanent)”。 同时,由于类class是JVM实现的一部分,并不是由应用创建的,所以又被认为是“非堆(Non-Heap)”内存。 在JDK8之前的HotSpot JVM,存放这些“永久 阅读全文

posted @ 2020-08-22 16:56 shumeigang 阅读(864) 评论(0) 推荐(0)

摘要:内存模型 方法区(Method Area):方法区是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。当方法区无法满足内存分配需求时,将抛出OutOfMemoryError 异常。方法区里存放着类的版本,字段,方法,接口和常量池。常量池里存储着字 阅读全文

posted @ 2020-08-22 16:03 shumeigang 阅读(227) 评论(0) 推荐(0)

摘要:内存溢出是什么? 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出。 内存溢出和内存泄漏有什么区别? 内存泄漏是由于使用不当,把一部分内存“丢掉了”,导致这部分内存不可用。当在堆中创建了对象,后来没有使用这个对象了,又没有把整个对象的相关引用 阅读全文

posted @ 2020-08-22 15:58 shumeigang 阅读(171) 评论(0) 推荐(0)

摘要:引用计数器法 当一个地方引用它时,就+1;当引用失效时,就-1;GC会回收那些计数为0的对象。 优点:简单,快捷 缺点:对于相互引用的对象会失效 可达性分析算法 通过一系列成为“GCRoots”的对象,向下搜索,搜索所走过的路线成为引用链。若是一个对象无法通过任何引用链和GCRoots相连接,则说明 阅读全文

posted @ 2020-08-22 15:54 shumeigang 阅读(176) 评论(0) 推荐(0)

摘要:堆与栈区别 栈是运行时的单位,而堆是存储的单位 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据; 堆解决的是数据存储的问题,即数据怎么放、放在哪儿。 栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。 阅读全文

posted @ 2020-08-21 17:30 shumeigang 阅读(358) 评论(0) 推荐(0)

摘要:JVM内存区域 一 方法区 1 什么是方法区 方法区,也称非堆(Non-Heap),又是一个被线程共享的内存区域。其中主要存储加载的类字节码、class/method/field等元数据对象、static-final常量、static变量、jit编译器编译后的代码等数据,。另外,方法区包含了一个特殊 阅读全文

posted @ 2020-08-21 17:24 shumeigang 阅读(194) 评论(0) 推荐(0)

摘要:1、概述 1991 年Sun 公司的James Gosling 等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒、PDA 等的微处理器;1994 年将Oak 语言更名为Java; java广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合,摆脱了硬件平台的束缚,实现了“ 阅读全文

posted @ 2020-08-21 17:22 shumeigang 阅读(217) 评论(0) 推荐(0)

摘要:1、概念 Exchanger(交换者)是一个用于线程间协作的工具类。 Exchanger 用于进行线程的数据交换。 Exchanger 提供一个同步点,在这个同步点,两个线程 可以交换 彼此的数据 只能是2个线程,他不支持更多的线程之间互换数据 当线程A调用Exchange对象的exchange() 阅读全文

posted @ 2020-08-20 10:12 shumeigang 阅读(151) 评论(0) 推荐(0)

摘要:概念 Semaphore是java并发包里面的一个工具类,我们限制可以访问某些资源的线程数目就可以使用Semaphore了 Semaphore:可理解为允许线程执行信号的池子,池子中放入多少个信号就允许多少线程同时执行。 Semaphore的作用:限制线程并发的数量 注意:的是 Semaphore 阅读全文

posted @ 2020-08-19 16:36 shumeigang 阅读(202) 评论(0) 推荐(0)

摘要:1、概念 CyclicBarrier可循环使用的屏障,让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时屏障才会开门 ,所有被屏障拦截的线程才会继续运行。 CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。 2.常用的方法: CyclicBarrier(in 阅读全文

posted @ 2020-08-19 15:00 shumeigang 阅读(159) 评论(0) 推荐(0)

摘要:1、概念 CountDownLatch:具有计数器的功能,等待其他线程执行完毕,主线程在继续执行,用于监听某些初始化操作,并且线程进行阻塞,等初始化执行完毕后,通知主线程继续工作执行 CountDownLatch计数的次数一定要与构造器传入的数字一致,比如构造器传入的是3,则countDown()一 阅读全文

posted @ 2020-08-19 10:53 shumeigang 阅读(77) 评论(0) 推荐(0)

摘要:背景 Java从JDK1.5开始提供了java.util.concurrent.atomic包,这个包中的原子操作类提供了一种用法简单,性能高效,线程安全地更新一个变量的方式。在Java并发比编程中,要想保证一些操作不被其他线程干扰,就需要保证原子性 1、原子更新基本类型类: AtomicBoole 阅读全文

posted @ 2020-08-19 09:38 shumeigang 阅读(186) 评论(0) 推荐(0)

摘要:Fork/Join框架介绍 Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务 结 果 后得到大任务结果的框架。Fork/Join框架要完成两件事情: 1.任务分割:首先Fork/Join框架需要把大的任务分割成足够小的子任务, 阅读全文

posted @ 2020-08-19 09:37 shumeigang 阅读(146) 评论(0) 推荐(0)

摘要:一.什么是阻塞队列? 阻塞队列是一个在队列基础上又支持了两个附加操作的队列。这两个附加的操作支持 阻塞和插入和移除方法。 支持阻塞的插入方法:队列满时,队列会阻塞插入元素的线程,直到队列不满。 支持阻塞的移除方法:队列空时,获取元素的线程会等待队列变为非空。 二.阻塞队列的应用场景 阻塞队列常用于生 阅读全文

posted @ 2020-08-19 09:36 shumeigang 阅读(312) 评论(0) 推荐(0)

摘要:什么是ConcurrentHashMap?ConcurrentHashMap 是java集合中map的实现,是哈希表的线程安全版本,即使是线程安全版本, ConcurrentHashMap的性能也十分可观。但是在不同的jdk版本中,其实现也不一样,本文主要基于jdk1.8版本的实现讨论。 Concu 阅读全文

posted @ 2020-08-19 09:35 shumeigang 阅读(748) 评论(0) 推荐(0)

摘要:什么是ConcurrentHashMap?ConcurrentHashMap 是java集合中map的实现,是哈希表的线程安全版本,即使是线程安全版本, ConcurrentHashMap的性能也十分可观。但是在不同的jdk版本中,其实现也不一样,本文主要基于jdk1.8版本的实现讨论。 Concu 阅读全文

posted @ 2020-08-14 17:23 shumeigang 阅读(11914) 评论(1) 推荐(1)

摘要:为什么要用join()方法 如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是 主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了 join() 的作用 让父线程等待子线程结束之后才能继续运行 阅读全文

posted @ 2020-08-14 10:51 shumeigang 阅读(213) 评论(0) 推荐(0)

摘要:Condition介绍 Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的。Object上的监视器只有一个等待队列,但是Condition上可以有多个等待队列 Condition是对象监视器的替代品,拓展了 阅读全文

posted @ 2020-08-14 10:50 shumeigang 阅读(268) 评论(0) 推荐(0)

摘要:LockSupport 当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应 工作。LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功 能,而LockSupport也成为构建同步组件的基础工具。 LockSupport 是用来创建锁和其他 阅读全文

posted @ 2020-08-13 18:22 shumeigang 阅读(113) 评论(0) 推荐(0)

摘要:ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量 ThreadLocal提供了线程的局部变量,每个线程都可以通过set()和get()来对这个局部 阅读全文

posted @ 2020-08-13 18:20 shumeigang 阅读(107) 评论(0) 推荐(0)

摘要:Lock接口 Lock不是Java中的关键字而是 java.util.concurrent.locks 包中的一个接口。下面我们简单介绍一下Lock接口。 一、Lock接口简介 Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有 阅读全文

posted @ 2020-08-13 18:19 shumeigang 阅读(175) 评论(0) 推荐(0)

摘要:什么是等待/通知机制? 多个线程之间也可以实现通信,原因就是多个线程共同访问同一个变量。但是这种通信机制不是 “等待/通知” ,两个线程完全是主动地读取一个共享变量。简单的说,等待/通知机制就是一个【线程A】等待,一个【线程B】通知(线程A可以不用再等待了)。 场景:一个线程修改了一个对象的值,而另 阅读全文

posted @ 2020-08-13 09:52 shumeigang 阅读(275) 评论(0) 推荐(0)

摘要:方法介绍 suspend():暂停任务 resume():恢复任务 stop():停止任务 stop() 当调用stop()方法时会发生两件事: 即刻停止run()方法中剩余的全部工作,包括在catch或finally语句中,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此 阅读全文

posted @ 2020-08-13 09:46 shumeigang 阅读(266) 评论(0) 推荐(0)

摘要:interrupt() 其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。 该方法经常用来“吵醒休眠的线程“。 当一些线程调用sleep() 方法处于休眠状态时,一个占有CPU资源的线程可以让休眠的线程 阅读全文

posted @ 2020-08-13 09:37 shumeigang 阅读(206) 评论(0) 推荐(0)

摘要:happens-before是JMM最核心的概念 happens-before字面翻译过来就是先行发生,A happens-before B 就是A先行发生于B? 不准确!在Java内存模型中,happens-before 应该翻译成:前一个操作的结果可以被后续的操作获取。讲白点就是前面一个操作把变 阅读全文

posted @ 2020-08-13 09:32 shumeigang 阅读(148) 评论(0) 推荐(0)

摘要:final域的内存语义 对于final域,编译器和处理器要遵守两个重要的重排序规则: 1:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2:初次读一个包含final域的对象的引用,与随后初次都这个final域,这两个操作之间不能重排 阅读全文

posted @ 2020-08-13 09:31 shumeigang 阅读(126) 评论(0) 推荐(0)

摘要:synchronized 的实现原理与应用 synchronized 称为 重要级锁 Synchronized的作用主要有三个: 原子性:确保线程互斥的访问同步代码;可见性:保证共享变量的修改能够及时可见,其实是通过Java内存模型中的 “对一个变量unlock操作之前,必须要同步到主内存中;如果对 阅读全文

posted @ 2020-08-13 09:29 shumeigang 阅读(158) 评论(0) 推荐(0)

摘要:数据保存在内存 优点: 存取速度快 缺点: 数据不能永久保存 数据保存在文件 优点: 数据永久保存 缺点:1)速度比内存操作慢,频繁的IO操作。2)查询数据不方便 数据保存在数据库 1)数据永久保存 2)使用SQL语句,查询方便效率高。 3)管理数据方便 什么是SQL?结构化查询语言(Structu 阅读全文

posted @ 2020-08-07 13:40 shumeigang 阅读(123) 评论(0) 推荐(0)

摘要:锁 1 公平锁/非公平锁 公平锁:多个线程申请获取同一个锁,按照线程的申请顺序,排队获取锁。公平锁的好处是等待的线程不会被饿死,相应的缺陷 就是整体吞吐量很低、效率很低,使用new ReentrantLock(true)可以构造一个公平锁。 非公平锁:多个线程申请获取同一个锁,获取锁的顺序不按照申请 阅读全文

posted @ 2020-08-06 19:29 shumeigang 阅读(114) 评论(0) 推荐(0)

摘要:sleep和wait的区别:1、sleep是Thread的静态方法,wait是Object的方法,任何对象实例都能调用。2、sleep不会释放锁,它也不需要占用锁。wait会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized中)。3、它们都可以被interrupted方法中断 阅读全文

posted @ 2020-08-06 19:27 shumeigang 阅读(890) 评论(0) 推荐(0)

摘要:Volatile 变量:一种同步的弱形式。它确保参一个变量的更新以可预见的方式告知其他的线程。1 Volatile 变量的操作不会加锁。也就不会引起执行线程的阻塞2 Volatile 变量地可见性的影响所产生的价值远远高于变量本身3 加锁可以保证可见性与原子性,volatile 变量只能可见性 4  阅读全文

posted @ 2020-08-06 19:25 shumeigang 阅读(125) 评论(0) 推荐(0)

摘要:concurrent包的实现 由于Java的CAS同时具有volatile读和volatile写的内存语义,因此Java线程之间的通信现 在有了下面4种方式。 1)A线程写volatile变量,随后B线程读这个volatile变量。 2)A线程写volatile变量,随后B线程用CAS更新这个vol 阅读全文

posted @ 2020-08-06 19:24 shumeigang 阅读(137) 评论(0) 推荐(0)

摘要:IDEA导入 插件方法 ​ 1 translation见下图​ 结果: ​ 阅读全文

posted @ 2020-08-01 09:29 shumeigang 阅读(116) 评论(0) 推荐(0)

摘要:JVM内存布局 ​ 方法区 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 这区域的内存回收目标主要是针对常量池的回收和对类型的卸载 和堆一样不需要连续的内存,并且可以动态扩展,动态扩展失败一样会抛出 OutOfMemoryError 异常。 本地方法栈 而本地方法栈 阅读全文

posted @ 2020-08-01 09:25 shumeigang 阅读(168) 评论(0) 推荐(0)

摘要:1:多余的 if/else,对于boolean值,避免不必要的等式判断。 反例: boolean ret; int i=0; if(i==0) { ret=true; } else { ret=false; } 类似上面这种写法if/else 可以简写: int i=0; boolean ret=( 阅读全文

posted @ 2020-08-01 09:23 shumeigang 阅读(244) 评论(0) 推荐(0)

摘要:Java中创建线程主要有三种方式: 一、继承Thread类创建线程类(Thread 是类,且实现了Runnable接口) (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 (2)创建Thread子类的实例,即创建了 阅读全文

posted @ 2020-08-01 09:22 shumeigang 阅读(389) 评论(0) 推荐(0)

导航