自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(126)
  • 收藏
  • 关注

原创 面向对象总结

<1>什么是封装?A.类:封装对象的属性和行为 B.方法:封装特定的业务逻辑 C.访问控制符:封装的是具体的访问权限<2>什么是继承?A.作用:代码复用 B.超类+子类+接口C.为什么有了超类还要有接口?超类是所有子类共有的特性,接口是部分子类共有的特性<3>什么是多态?多态就是多种形态A.行为多态:抽象方法都是多态的,因为抽象方法一定会被重写,重...

2020-01-10 10:49:52 204

原创 JVM的内存

heap:new 出来的和实例变量stack:局部变量方法区:.class文件、方法(静态+非静态)、静态变量、常量池执行顺序:先加载进方法区,再在heap中new个实例对象,最后指向引用...

2019-12-15 11:20:21 182

原创 static

A.静态变量<1>属于类的,存储在方法区中,只有一份 实例变量和静态变量的区别<2>常用类名来访问,也可用对象访问<3>何时用:所有对象所共享的数据(图片、音频、视频等)B.静态方法<1>属于类的,存储在方法区中,只有一份<2>常用类名来访问,也可用对象访问<3>静态方法没有隐式this传递,静态方法中不能直...

2019-12-15 10:34:48 199

原创 JAVA中的变量

A.实例变量+静态变量=成员变量B.实例变量:属于对象静态变量:属于类

2019-12-15 10:29:37 110

原创 重写和重载的区别

1)重写(Override):1.1)发生在父子类中,方法名相同,参数列表相同,方法体不同1.2)遵循"运行期绑定"(动态绑定),根据对象的类型来调用方法2)重载(Overload):2.1)发生在一个类中,方法名相同,参数列表不同,方法体不同2.2)遵循"编译期绑定"(静态绑定),根据参数/引用的类型来绑定方法静态链接和动态链接的区别...

2019-12-13 21:20:51 114

原创 静态绑定和动态绑定的区别

静态绑定和动态绑定的区别A.静态绑定是绑定类,动态绑定是绑定对象B.静态绑定在编译期绑定,动态绑定在运行期绑定C.静态绑定==不可以被继承或继承后不能被重写...

2019-12-13 21:19:48 2996

原创 重写原则

"一大两同两小"原则:<1>一大:子类方法的访问权限>=父类<2>两同: A.方法名相同 B.参数列表相同<3>两小A.子类方法的返回值类型<=超类方法的a.void时,必须相同b.基本类型时,必须相同c.引用类型时,小于或等于B.子类方法抛出的异常<=父类方法的eg. public int fun(int a,int b)...

2019-12-13 21:16:54 323

原创 使用Group By语句的注意事项

<1> select子句中的列名必须为「分组列」或「聚合函数」,列函数对于group by子句定义的每个组返回一个结果<2> group by在逻辑上或机读的顺序:位于where之后,位于order by之前...

2019-12-01 11:03:53 619

原创 栈排序---LintCode229

样例输入:1 3 2 10样例输出:10 3 2 1要求:不能使用栈以外的其他数据结构public Stack<Integer> StackSort(Stack<Integer> s1){ if(s1.isEmpty()) return s1; Stack<Integer> s2=new Stack<>(); ...

2019-12-01 09:22:20 147

原创 进程通信方式

A.共享内存<1>进程必须互斥的访问共享空间B.管道<1>同一时间内仅支持一个方向的数据传递,是半双工通信方式,如果实现全双工通信要使用两个管道<2>管道没有写满,线程2是不能读取管道内容;线程2没有将管道内容读完,线程1是不能写,所以这种通信方式本质也是互斥的C.消息传递<1>直接传递:直接挂到对方的消息队列<2>间接传...

2019-11-28 17:05:22 75

原创 synchronized锁住的是什么?

对象锁:同步方法锁住的是对象A.一个对象+有多个synchronized方法:某一时刻内,只要有一个线程去调用其中一个synchronized 方法,其他的线程都要等待。B.一个对象中+synchronized方法+非synchronized方法:某个线程访问同步方法不影响其他线程访问非同步方法C.多个对象+多个同步方法:访问不同的对象的同步方法不会相互影响全局锁:静态同步方法锁的是当前的...

2019-11-27 20:51:10 251

原创 生产者消费者问题---Lock+singalAll+await

import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class appliance{ private int num=0; Lock l=new ReentrantL...

2019-11-27 20:29:12 106

原创 生产者消费者问题---Synchronized+wait+notify

A.加锁的对象、调用wait()的对象、调用notify()的对象,这三者是一个对象B.生产者和消费者加锁的对象必须是同一个对象class shared_Resource{ private int num=0; public synchronized void decrement() { while(num==0) { ...

2019-11-27 15:07:21 140

原创 Synchronized 和lock的区别

A.原始构成<1>synchronized关键字属于jvm, 底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象只有在同步或方法中才能掉wait/notify等方法<2>Lock是具体类,是api层面的锁(java.util.)B.使用方法<1>sychronized不需要用户取手动释放锁,当synchroni...

2019-11-26 21:56:23 90

原创 虚假唤醒

A.为什么会出现虚假唤醒?虚假唤醒的出现在于生产者的notify并不在临界区内,也就是说,生产者使用临界区保护了修改流水线的这个操作,然后解锁,解锁完毕后才notify。而在这之间是非原子的。在以下情况:1).生产者对临界区加锁2).修改流水线状态3).生产者解锁4).notify通知消费者线程在3)与4)间是有空隙的,如果在3)进行后突然此刻加入了一个新的消费者,这个消费者察觉到流...

2019-11-26 09:30:17 266

原创 CyclicBarrier

A.什么是CyclicBarrier可循环(Cyclic)使用的屏障。让一组线程到达一个屏障(也可叫同步点)时被阻塞,知道最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CycliBarrier的await()方法B.例子先到的线程被阻塞,当线程数到3后执行主线程public static void main(String[] args) { ...

2019-11-25 11:11:12 68

原创 容器添加和获取方法对比

2019-11-25 10:56:41 100

原创 CountDownLatch

A.什么是CountDownLatchCountDownLatch主要有两个方法,当一个或多个线程调用await()方法时,调用线程会被阻塞。其他线程调用countDown()方法会将计数器减1,当计数器的值变为0时,因调用await()方法被阻塞的线程才会被唤醒,继续执行B.为什么要引入CountDownLatch由于并发有异步性,不能保证特定的线程执行顺序,现在就是为了保证特定的执行顺序...

2019-11-25 10:28:07 97

原创 常见异常的总结

A.InterrputedException<1>在CountDownLatch中await方法

2019-11-25 10:14:54 78

原创 读写锁

A.什么是读写锁?读操作共享资源,写操作独占资源B.手写一个读写锁import java.util.HashMap;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantReadWriteLock;class cache { HashMap<String, St...

2019-11-25 08:49:07 69

原创 ABA问题

什么是ABA问题?被换过两次,表面上还是A,其实中间换过一次举个ABA在现实生活中的例子?用代码展示ABA问题public class singleton { public static void main(String[] args) { AtomicReference num=new AtomicReference(100); new Threa...

2019-11-24 20:11:34 135

原创 为什么atomicIneger底层要用CAS而不是synchronized?

A.synchronized采用的是悲观锁,是一种独占锁,独占锁就意味着 其他线程只能依靠阻塞来等待线程释放锁。而在 CPU 转换线程阻塞时会引起线程上下文切换,当有很多线程竞争锁的时候,会引起 CPU 频繁的上下文切换导致效率很低B.CAS采用的是一种乐观锁的机制,它不会阻塞任何线程,所以在效率上,它会比 synchronized 要高。所谓乐观锁就是:每次不加锁而是假设没有冲突而去完成某项操...

2019-11-24 10:54:27 1129 1

原创 CAS

CAS又是怎样保证原子性的?

2019-11-24 10:53:36 113

原创 CAS又是怎样保证原子性的?

A.什么是CAS?<1>全称是compareAndSet,含义是比较并交换。<2>CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则返回VB.下面来看下AtomicInteger.incrementAndGet()的源码public final int incrementAndGet() { ...

2019-11-24 10:48:54 4470

原创 JAVA线程的6种状态

将操作系统三态模型和上面对比着学习三态链接可运行状态就是就绪态<1>观察可运行态和运行态:进入运行态的唯一方式是从可运行态进入;从运行态到可运行态有一个yield()方法,可以回忆在验证volatile的原子性中有一个判断是这样写的while(Thread.activeCount>2){ Thread.yield();}这样主线程就会再次进入到可运行态...

2019-11-23 22:00:18 126

原创 volatile

1.保证可见性:链接2.不保证原子性:链接3.禁止指令重排:A.重排序发生的场景:链接B.重排序解决办法:链接4.volatiled的应用场景:链接

2019-11-23 14:52:05 77

原创 volatile的应用场景

下面先来想一下单例模式中的双端检查public class singleton { private static singleton instance; private singleton(){} private static singleton getInstance() { if(instance==null)//(1) ...

2019-11-23 14:47:57 145

原创 单例模式

A.饿汉模式a.类加载到内存后,就实例化一个单例,JVM保证线程安全b.缺点:不管用到与否,类加载时就完成了实例化public class singleton { private static final singleton Instance=new singleton(); //构造方法私有化,这样就不可以new一个对象出来了 private singleton()...

2019-11-22 21:41:02 94

原创 重排序的解决方法

通过volatile标记,可以解决编译器层面的可见性与重排序问题。而内存屏障则解决了硬件层面的可见性与重排序问题A.store指令和load指令store:将cpu缓存的数据刷新到主存中load:将主存中的数据拷贝进cpuB.内存屏障的种类C.volatile写实现的内存屏障a.StoreStore屏障可以保证在volatile写之前,其前面的所有普通写操作已经对任意处理器可见了...

2019-11-22 20:59:22 331

原创 重排序发生的场景

A.处理器执行时的优化:a.处理器层面的“乱序”优化节省了大量等待时间,提高了处理器的性能。所谓“乱序”只是被叫做“乱序”,实际上也遵循着一定规则:只要两个指令之间不存在数据依赖,就可以对这两个指令乱序。不必关心数据依赖的精确定义,可以理解为:只要不影响程序单线程、顺序执行的结果,就可以对两个指令重排序b.乱序优化在单核时代不影响正确性;但多核时代的多线程能够在不同的核上实现真正的并行,一旦...

2019-11-22 20:28:29 252

原创 volatile不保证原子性

1.什么是原子性?不可分割、完整性,即某个线程正在做某个具体业务时,中间不可以被加塞或者被分割,需要整体完整,要么同时成功,要么同时失败2.写一个demo来验证volatile不保证原子性/* 大概率结果不是2000 因为i++不是一步操作,而不是一步操作,所以无法保证原子性*/class source{ volatile int id=0; public v...

2019-11-22 14:12:15 143

原创 ArrayList高并发相关内容

A.底层存放的是object类型B.初始值是10,hashmap的初始值是16C.ArrayList扩容是原来的一半,第一次就扩容成15,第三次扩容是22;hashMap的扩容是原值的一倍D.扩容使用的是Arrays.copyOf(int arr[],int newLength),第一个参数是旧数组,第二个参数是新数组长度E.ArrayList是线程不安全a.故障现象:写一段ArrayL...

2019-11-21 21:22:40 227

原创 volatile保证可见性

1.什么是可见性?当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值2.在保证可见性的过程中,线程之间的通信是什么机制?共享内存3.描述下volatile保证可见性的过程所有的变量都存放在主内存,需要时拷贝,修改完再存回主内存4.验证volatile可见性class source{ volatile int id=0; public ...

2019-11-21 21:17:42 146

原创 HashMap是头插法还是尾插法

1.JDK8以前是头插法,JDK8后是尾插法2.为什么要从头插法改成尾插法?A.因为头插法会造成死链,参考链接B.JDK7用头插是考虑到了一个所谓的热点数据的点(新插入的数据可能会更早用到),但这其实是个伪命题,因为JDK7中rehash的时候,旧链表迁移新链表的时候,如果在新表的数组索引位置相同,则链表元素会倒置(就是因为头插) 所以最后的结果 还是打乱了插入的顺序 所以总的来看支撑JDK...

2019-11-21 11:15:47 26123 6

原创 可重入锁

一.定义又名递归锁,含义是线程可以进入任何一个它已经拥有锁的所同步的代码块二.模板//获取外层方法(fun1)的锁后会自动获取内层的锁(fun2)public synchronized void fun1(){fun2();}public synchronized void fun2() {}三.synchronized 和ReentrantLock都是可重入锁1.演示synchr...

2019-11-20 20:35:25 71

原创 hashMap的线程不安全问题

1.写一个hashMap线程不安全的例子Map<String,String> map=new HashMap<>();for(int i=0;i<3;i++){ new Thread(()->{ map.put(Thread.currentThread().getName(),UUID.randomUUID().toString()...

2019-11-20 14:01:56 184

原创 为什么链表的长度是8的时转红黑树?+ 加载因子为什么是0.75?

A.首先需要明确的是:加载因子越大空间利用率就越高,可以充分的利用数组的空间;加载因子越小产生碰撞的概率的就越小,进而查找的就越快(耗时少);简而言之是空间和时间的关系B.为什么链表的长度是8的时转红黑树?+ 加载因子为什么是0.75?根据泊松分布可以得出当加载因子为0.75,链表长度为8时,再加入元素发生冲撞的概率最低...

2019-11-20 10:43:01 566

原创 HashMap扩容的问题

A.HashMap的初始容量和扩容都是以2的次方来进行?链接B.HashMap什么时候扩容?达到0.75C.每次扩容的量?每次扩容一倍,初始容量是16,第一次扩容是32,第二次是64...

2019-11-19 21:29:35 684

原创 为什么数组的初始长度是2的指数次幂?

1.效率问题:计算数组下标时取模运算的效率低于位运算,在进行扩容时会频繁的进行数组下标的运算2.在计算数组下标时的源码如下static int indexFor(int h,int length){ return h&(length-1);}分析:a.只有当HashMap的length为2的整数倍时,length-1的结果是全1,如HashMap的初始值是16,那么l...

2019-11-19 21:26:46 589

原创 HashMap的putVal方法源码解析

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; //该判断就是怕空表导致n=0 if ((tab = table) == null ||...

2019-11-19 19:45:45 268

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除