- 博客(34)
- 资源 (15)
- 收藏
- 关注
原创 15个Java线程并发面试题和答案
15个Java线程并发面试题和答案面试Java开发者时常问的15个Java多线程和并发问题1. 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?这个线程面试题通常在第一轮面试或电话面试时被问到,这道多线程问题为了测试面试者是否熟悉 join 方法的概念。答案也非常简单——可以用 Thread 类的 join 方法实现这一效果。...
2019-08-24 10:04:30 550
原创 什么是Java优先级队列(Priority Queue)
什么是Java优先级队列(Priority Queue)?PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时...
2019-08-24 10:01:03 594
原创 堆内存溢出及解决方法
堆内存溢出及解决方法【情况一】: java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环; 如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决: < jvm-arg>-Xms3062m < / jvm-arg> < ...
2019-08-24 09:55:34 1020
原创 ReenTrantLock可重入锁(和synchronized的区别)总结
ReenTrantLock可重入锁(和synchronized的区别)总结可重入性:从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。锁的实现:Synchronized是依赖于JVM实现的...
2019-08-24 09:54:31 169
原创 分析线程池的实现原理和线程的调度过程
分析线程池的实现原理和线程的调度过程ThreadPoolExecutor调度线程执行器ScheduledThreadPoolExecutor是线程执行器ThreadPoolExecutor的扩展,在ThreadPoolExecutor基础之上添加了在一定时间间隔之后调度任务的核心功能,也包括之后的按既定时间间隔去调度任务的功能。...
2019-08-24 09:34:29 2090
原创 线程池的种类,区别和使用场景
线程池的种类,区别和使用场景一个线程从被提交(submit)到执行共经历以下流程:线程池判断核心线程池里是的线程是否都在执行任务,如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下一个流程线程池判断工作队列是否已满。如果工作队列没有满,则将新提交的任务储存在这个工作队列里。如果工作队列满了,则进入下一个流程。线程池判断其内部线程是否都处于工作状...
2019-08-24 09:33:34 353
原创 如何检测死锁和预防死锁
有两个容器,一个用于保存线程正在请求的锁,一个用于保存线程已经持有的锁。每次加锁之前都会做如下检测:1)检测当前正在请求的锁是否已经被其它线程持有,如果有,则把那些线程找出来2)遍历第一步中返回的线程,检查自己持有的锁是否正被其中任何一个线程请求如果第二步返回真,表示出现了死锁三种用于避免死锁的技术:1、加锁顺序(线程按照一定的顺序加锁)2、加锁时限(线程尝试获取锁的时候...
2019-08-24 09:32:43 341
原创 ConcurrenHashMap介绍1.8 中为什么要用红黑树
ConcurrenHashMap介绍1.8 中为什么要用红黑树java8不是用红黑树来管理hashmap,而是在hash值相同的情况下(且重复数量大于8),用红黑树来管理数据。 红黑树相当于排序数据。可以自动的使用二分法进行定位。性能较高。在ConcurrentHashMap中,就是把Map分成了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个S...
2019-08-24 09:30:33 1023
原创 Synchronized在静态方法和普通方法上的区别
synchronized 在静态方法和普通方法的区别?synchronized修饰不加static的方法,锁是加在单个对象上,不同的对象没有竞争关系;修饰加了static的方法,锁是加载类上,这个类所有的对象竞争一把锁。...
2019-08-24 09:27:24 1513
原创 Java信号灯
1、Semaphore概念Semaphore是Java1.5之后提供的一种同步工具,Semaphore可以维护访问自身线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,通过acquire()获取一个许可,如果没有就等待,而release()释放一个许可。Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕...
2019-08-24 09:25:48 152
原创 volatile的实现原理
JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是就算写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题,所以在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理...
2019-08-19 23:29:44 80
原创 synchronized底层实现和优化
原理:synchronized底层是通过一个monitor的对象阻塞和获取。对代码同步:指令执行时,monitor的进入数减1,如果减1后进入数为0,那线程退出monitor,不再是这个monitor的所有者。其他被这个monitor阻塞的线程可以尝试去获取这个monitor的所有权。对方法同步:常量池中多了ACC_SYNCHRONIZED标示符。JVM就是根据该标示...
2019-08-19 23:28:48 166
原创 CAS机制
CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。CAS的缺点:1.CPU开销较大在并发量比较高的情况下,如果许多线程反复尝试更新某一个变量,却又一直更新不成功,循环往复,会给CPU带来很大的压力。2.不能保证代码块的原子性CAS机制所保证的只是一个变量的原子性操作,...
2019-08-19 07:42:52 92
原创 模板方法模式
定义一个模板结构,将具体内容延迟到子类去实现。解决的问题提高代码复用性将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中实现了反向控制通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”...
2019-08-19 07:41:52 85
原创 类加载过程
JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化这五个过程。1.虚拟机在首次加载Java类时,会对静态代码块、静态成员变量、静态方法进行一次初始化(静态间按顺序执行)。2.只有在调用new方法时才会创建类的实例。3.类实例创建过程:父子继承关系,先父类再子类。父类的静态->子类的静态->父类的初始化块->父类的构造方法->子类的初始化块->...
2019-08-19 07:40:57 82
原创 java的4种引用 强软弱虚
强引用new一个对象,强引用不会被GC回收。软引用(SoftReference)如果一个对象只具有软引用,那就类似于可有可物的生活用品。弱引用(WeakReference)如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管...
2019-08-19 07:39:41 91
原创 AOP代理模式
AOP 全称 Aspect Oriented Programming,面向切面编程,和 OOP 一样也是一种编程思想。AOP 出现的原因是为了解决 OOP 在处理 侵入性业务上的不足。代理模式分为静态代理和动态代理两种。静态代理:通常用于对原有业务逻辑的扩充。创建一个代理类实现和方法相同的方法,通过让代理类持有真实对象,然后在原代码中调用代理类方法,来达到添加我们需要业务逻辑的目的。动...
2019-08-19 07:37:59 130
原创 Java虚拟机部分
程序计数器 指示当前程序执行到了哪一行,执行JAVA方法时纪录正在执行的虚拟机字节码指令地址;执行本地方法时,计数器值为undefined 虚拟机栈 用于执行JAVA方法。栈帧存储局部变量表、操作数栈、动态链接、方法返回地址和一些额外的附加信息。程序执行时栈帧入栈;执行完成后栈帧出栈 本地方法栈 ...
2019-08-18 22:10:34 82
原创 Java性能优化
真正影响JAVA程序性能的,就是碎片化。碎片是JAVA堆内存中的空闲空间,可能是TLAB剩余空间,也可能是被释放掉的具有较长生命周期的小对象占用的空间。 减少new对象。每次new对象之后,都要开辟新的内存空间。这些对象不被引用之后,还要回收掉。因此,如果最大限度地合理重用对象,或者使用基本数据类型替代对象,都有助于节省内存; 多使用局部变量,减少使用静态变量。局部变量被创建在栈中...
2019-08-18 22:09:40 102
原创 线程池工作原理
一个线程从被提交(submit)到执行共经历以下流程: 线程池判断核心线程池里是的线程是否都在执行任务,如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下一个流程 线程池判断工作队列是否已满。如果工作队列没有满,则将新提交的任务储存在这个工作队列里。如果工作队列满了,则进入下一个流程。 线程池判断其内部线程是否都处于工作状态。如果...
2019-08-18 22:03:55 72
原创 java代码优化(下)
(21)将常量声明为static final,并以大写命名这样在编译期间就可以把这些内容放入常量池中,避免运行期间计算生成常量的值。另外,将常量的名字以大写命名也可以方便区分出常量与变量(22)不要创建一些不使用的对象,不要导入一些不使用的类这毫无意义,如果代码中出现”The value of the local variable i is not used”、”The import ...
2019-08-18 21:48:32 338
原创 Java代码优化(上)
(1)尽量指定类、方法的final修饰符带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final...
2019-08-18 21:46:23 120
原创 Java集合知识点
发表于 2018-03-29 15:36:01|查看: 1448|回复: 0 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Ja...
2019-08-18 21:41:51 106
原创 实现堆内存溢出、栈内存溢出
递归调用可以导致栈溢出不断创建对象可以导致堆溢出代码如下:publicclassTest{publicvoidtestHeap(){for(;;){ArrayListlist=newArrayList(2000);}}intnum=1;...
2019-08-18 21:40:08 373
原创 HashMap实现原理
HashMap是数组+链表实现的,既然用到hash散列,那么肯定不可避免的会出现冲突问题,HashMap解决冲突的方法是拉链法,因为这里有用到数组,那么当容量不足的时候就需要进行扩容操作了,在HashMap中有个术语叫冲突,当冲突几率越来越高的时候就需要进行扩容操作了,那什么情况就叫冲突几率高呢?就是当我们的数组元素个数超过了数组原先大小*装填因子,默认情况下的装填因子是0.75,扩容有个坏处就...
2019-08-18 21:35:18 72
原创 http与https
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。区别:1、https协...
2019-08-18 21:33:12 151
原创 Java程序怎么优化
提高JAVA的性能,一般考虑如下的四个主要方面:(1)程序设计的方法和模式(2)JAVA布署的环境。(3)JAVA应用程序的实现(4)硬件和操作系统为了提高JAVA程序的性能,需要遵循如下的六个步骤。a)明确对性能的具体要求b)了解当前程序的性能c)找到程序的性能瓶颈d)采取适当的措施来提高性能e)只进行某一方面的修改来提高性能f)返回到步骤c,继续作类似的工作,一直达到...
2019-08-18 21:30:41 311 1
原创 Python知识点整理
python中,可变对象和不可变对象 ,python中string,tuple,numbers等是不可变的对象,而list,dict等则是可以修改的对象。下面例子中a是可变对象,一个进程上下文中只有一份内存地址,不可变对象例如1,2,3,4,5,一个进程上下文共享一份内存。def func(a=[]):a.append(12)print a,id(a)2.@stati...
2019-08-04 22:09:07 340
原创 策略模式
使用场景:在有相似功能方法的情况下,避免出现大量if/else语言,造成代码冗余UML类图:public class CashContext { private CashSuper cashSuper; public CashContext(CashSuper cashSuper) { this.cashSuper = cashSu...
2019-08-04 11:02:29 69
原创 nginx正向代理和反向代理
一张图看懂正向代理和反向代理在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;实际上,Proxy在两种代理中做的事情都是替服务器代为收发请求和响应,不过从结构上看正好左右互换了一下,所以把后出现的那种代理方式称为反向代理了。Nginx支持的负载均衡...
2019-08-03 22:16:19 114
原创 A01-单例模式
public class Singletom { private static Singletom instance; //私有构造函数,不允许实例化对象 private Singletom() { } public static Singletom() { if (null == instance) { in...
2019-07-31 09:41:18 87
原创 谷歌翻译API
请求谷歌翻译API,不过这个东西会随着谷歌的更新而改变,不知道今后是否可用。有需要的同学可以联系我#!/usr/bin/python#coding: UTF-8import sysreload(sys)sys.setdefaultencoding('utf8')import reimport urllib,urllib2 #引入接入网络接口API的模块import sock_s
2016-12-09 15:53:36 1843 2
模糊控制matlab仿真simulink离线控制表
2015-04-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人