- 博客(50)
- 收藏
- 关注
原创 解析DNS过程
DNS提供的服务是用来将域名转换为IP地址的工作。TCP/IP协议详解中给的定义是:它是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。属于应用层协议。在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。如果hosts里没有这个域名的映射,...
2019-09-09 19:50:31 141
原创 网络请求的全过程,从客户端到服务器
域名解析 —> 与服务器建立连接(TCP/IP三次握手) —> 发起HTTP请求 —> 服务器响应HTTP请求,浏览器得到html代码 —> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片) —> 浏览器对页面进行渲染呈现给用户https://blog.csdn.net/u013777975/article/details/80496121...
2019-09-09 18:58:01 501
原创 TCP和UDP的区别
tcp提供的是面向连接,可靠的字节流服务。也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来。使用TCP协议传输数据,TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。当数据从A端传到B端后,B端会发送一个确认包(ACK包)给A端,告知A端数据我已收到!UDP提供的是简单的面向数据报的传输层协议,UDP协议不可...
2019-09-09 18:39:20 135
原创 java中的线程池实现有哪些?FixedThreadPool底层使用的是什么任务队列
四种线程池:1.newFixedThreadPool()方法:该方法返回一个固定线程数量的线程池。线程池中的线程数量始终不变,当新任务提交若有空闲线程则立即执行,没有,则新的任务会暂存在一个任务队列中,待有线程空闲时,便处理任务队列中的任务。2.newSingleThreadExecutor()方法:该方法返回一个只有一个线程的线程池。该任务队列是一个先进先出的顺序执行队列。3.newCac...
2019-09-08 10:33:17 546
原创 java中synchronize代码块的实现,以及jdk1.6对锁的优化,锁升级
被sunchronized关键字修饰的代码块在被编译成代码块的时候,会在代码块的开始和结束插入monitorenter和moniterexit指令。任何对象都有一个monitor与之关联,而且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter指令时,将会尝试获得对象所对应的monitor的所有权,即尝试获得对象的锁。虚拟机在执行这两个指令时会检查对象的锁状态是否为空或...
2019-09-08 09:53:59 457
原创 java中synchroize和lock的区别使用场景
1.lock可以使用Condition进行线程之间的调度Synchronized则使用Object对象本身的notify,wait,nitityall调度Condition有更好的灵活性,而且一个lock对象可以有多个Condition,从而可以有选择性的调度线程,更加灵活。而synchronized只能针对同一个对象,所有线程都注册在它身上,线程的调度没有选择权,会出现很大的问题2.loc...
2019-09-08 08:37:26 508 1
原创 java中Reentrantlock的使用场景
1.在并发量和高的情况下主要是防止资源使用冲突,保证同一时间内只有一个操作可以使用该资源。但与synchronized的明显区别是性能优势(伴随jvm的优化这个差距在减小)。同时Lock有更灵活的锁定方式,公平锁与不公平锁,而synchronized永远是非公平的。2.如果发现该操作已经在执行中则不再执行(有状态执行)例如:用在定时任务时,如果任务执行时间可能超过下次计划执行时间,确保该有...
2019-09-06 09:08:16 893
原创 介绍一下Reentrantlock
Reentrantlock是java.util.concurrent.lcoks中的可重入锁,在高竞争下有更好的性能,且可以中断。Reentrantlcok是基于AQS实现的。AQS是基于FIFO队列实现的,整个AQS是典型的模板模式的应用,设计的十分精巧,对于FIFO队列的各种操作在AQS中已经实现,AQS的子类一般只需要重写tryacquire(int arg)和tryrelease(int ...
2019-09-06 08:38:12 149
原创 介绍一下condition
coditon的await,signal和Object的wait,notify方法类似,只是wait和notify是与synchronized配合使用,而condition是与重入锁相关联的。通过lock接口的condition newcondition()方法可以生辰一个与当前重入锁绑定的condition实例。当condition执行wait后会放开锁,而如果要唤醒它,除了要执行signal...
2019-09-04 21:24:51 229
原创 介绍一下AbstractQueueSynchronizer
AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架。AQS为一系列同步器依赖于一个单独的原子变量(state)的同步器提供了一个非常有用的基础。子类们必须定义改变state变量的protected方法,这些方法定义了state是如何被获取或释放的。假定这些条件后,此类中的其他方法就可以实现所有队列和阻塞机制。AQS同时提供了两种模式互斥模式和共享模式,互斥模式的应用:Reent...
2019-09-04 21:09:48 125
原创 启动线程时start和run的区别是什么
1.start()方法:用来启动线程,实现了多线程的运行,通过调用Tread类的start方法来启动一个线程,这时此线程处于就绪态,没有运行,当此条线程得到了cpu的时间片,就开始执行run方法,这里的run方法称为线程体,他包含了要执行这个线程的内容,run方法运行结束,线程终止。2.run方法就是一个普通的方法,如果直接调用run方法,他仅仅在主线程这条线程中执行。程序仍然顺序执行,执行完r...
2019-09-04 20:11:07 169
原创 java中如何创建线程的
java创建线程的四种方式:1.继承thread2.实现Runnable 实现接口可以避免单继承的局限,此时子类负责真实的业务操作,thread负责资源调度与线程创建辅助真实业务。Runnable任务也可在Executors中或者ExecutorService提交运行3.线程池 不用的线程池针对不同的需求4.实现callableCallable与RunnableCal...
2019-09-04 20:02:50 114
原创 用java实现生产者消费者的三种方法
1,使用norify和wait生产者会判断如果仓库已满则会wait,而消费者在消费之后会有一个notify提醒生产者。同理消费者会判断,如果仓库为空则会wait,而生产者在生产一个之后会notify2.使用await和signal原里和1差不多,只不过用的是lock和condition,而上边用的是synchronized和Object3.使用阻塞队列参考博客:https://www.c...
2019-09-04 19:09:24 201
原创 死锁是如何产生的以及四个必要条件
死锁产生的原因:1.对共享资源的竞争2.进程的推进顺序不当死锁产生的四个必要条件:● 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。 ● 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资...
2019-09-04 18:54:50 90
原创 synchronized和volatile的区别
volatile本(可见性和禁止指令重排)质volatile变量在每次被线程访问时,都强迫从主内存中重读该变量的值,而当该变量发生变化时,又会强迫线程将最新的值刷新到主内存,这样任何时刻,不同的线程总能看到该变量的最新值。,synchronized则是锁定当前变量。只有当前线程可以访问该变量,其他线程被线程阻塞住volatile不会造成线程阻塞而synchronized会造成volatile仅...
2019-09-04 18:35:40 165
原创 JAVA线程中的同步方式有哪些
1.同步方法,既有synchronized关键字修饰的方法2.同步代码块,synchronized关键字修饰的语句块3.特殊域变量violatile实现的同步4.使用reetranlock实现的线程同步5使用局部变量实现线程同步,如果使用threadloca管理变量,则每一个使用该变量的线程都获得该变量的一个副本,副本之间相互独立,这样每一个线程都可以所以修改自己的变量副本,而不会对其他线...
2019-09-01 19:25:18 164
原创 简述为什么会出现锁的机制
java允许多线程并发控制,当多个线程同时操作一个共享资源变量时,(如数据的增删改查)将会对导致数据出现不正确的结果,相互之间产生冲突,因此需要加入锁保证该变量的唯一和准确性。...
2019-08-31 14:53:57 235
原创 happen before
先行发生原则(Happens-Before)是判断数据是否存在竞争、线程是否安全的主要依据。先行发生是Java内存,模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,那么操作A产生的影响能够被操作B观察到。口诀:如果两个操作之间具有happen-before关系,那么前一个操作的结果就会对后面的一个操作可见。是Java内存模型中定义的两个操作之间的偏序关系。常见的happen-b...
2019-07-04 20:18:30 386
原创 简述java内部类
首先我们考虑为什么使用内部类:使用内部类最吸引人的原因是:内部类最大的有点在于它能非常好的解决多继承的问题,使用内部类还能够带给我其他特性(1)提供更好的封装性,除了外围类其他类都不能访问。(2)内部类:成员内部类,静态内部类,局部内部类,匿名内部类成员内部类: 他的主要作用就是访问外部类数据inner类定义在outer类内部,相当于outer类的一个成员变量的位置,inner类可以...
2019-07-04 20:05:14 121
原创 java中的异常结构
Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常。 其中异常类Exception又分为运行时异常(RuntimeException),非运行时异常。运行时异常都是RUntimeexception及其子类如NullPointerException、IndexOutOfBoundsException等,又叫不检查异常,程序可以捕获处理也可以...
2019-07-02 15:17:59 131
原创 char可以存储汉字吗
char是按照字符存储的,不管英文还是中文,固定占用占用2个字节,用来储存Unicode字符。unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有 被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。...
2019-07-02 14:37:26 767
原创 Object的方法有那些
wait,notify,notifyall,clone,hashcode,equals,tostring,finalize
2019-07-01 20:51:43 189
原创 java中的泛型擦除
java的泛型只存在源码中,在编译后的字节码被替换中原生类型,在泛型类被类型擦除的时候,如果类型参数部分没有指定界限,如 会被转译成普通的 Object 类型,如果指定了上限,则类型参数被替换成类型界限。ArrayList 与 ArrayList 编译后都被擦除了,变成了原生类型 ArrayList。泛型使用的注意事项:https://blog.csdn.net/zly921112/artic...
2019-07-01 20:49:45 76
原创 简述虚拟机栈的各个部分
每一个方法从调用开始到执行完成的过程,就对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。 每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。局部变量表: 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。操作数栈:在方法执行的过程中,会有各种字节码指向操作数栈中写...
2019-07-01 20:26:14 594
原创 对象的内存布局
对象的内存布局:对象头 对象头包括两部分信息,一部分是存储对象运行时的数据,如哈希码(HashCode)、GC分代年龄、状态标志位、锁记录指针、偏向线程ID等。对象头的另外一部分是一个类型指针,即指向对象的类元数据的指针实例数据 实例数据,即对象真正存储的有效信息,也是程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是子类中定义的,都需要记录起来。对齐填充** 对齐...
2019-07-01 19:39:10 76
原创 静态分派和动态分派
静态分派:所有依赖静态类型来定位方法执行版本的分派成为静态分派,发生在编译时期,典型**应用为方法重载。静态分派发生在编译阶段,因此确定静态分派的动作实际上不是由虚拟机来执行的。动态分派:典型应用为重写,是一种动态的概念。向上转型后调用子类覆写的方法便是一个很好地说明动态分派的例子。就是说,我们在判断执行的方法是父类中的方法还是子类中覆盖的方法时;如果用静态类型来判断,那么无论怎么进行向上转型...
2019-07-01 10:14:13 112
原创 双亲委派模型,类加载器
java中类加载器主要用于实现类的加载,java中的类加载器和类一起唯一确定类在jvm的唯一性。类加载器定义:类加载过程阶段中的“通过一个类的全限定名来获取此类的二进制字节流”这个动作放在JAVA虚拟机外部实现,以便应用程序自己决定如何获取所需的类。实现这个动作的代码称作类加载器。启动类加载器扩展类加载器应用程序类加载器自定义类加载器双亲委派模型:除了顶层的启动类加载器其他加载器都有...
2019-07-01 09:03:51 91
原创 hashmap保存自定义类是需要重写自定义类的哪些方法
需要重写hashcode和equals方法hashmap中put添加数据时,首先判断hashcode是否相等,再判断key是否equals.由于hashcode码默认的是内存地址,equals默认的是判断两个对象是不是同一个实例,都不符合我们需要key在数组链表位置和逻辑上的相等,所以我们需要重写hashcode和equals方法。...
2019-06-30 10:05:36 649
原创 CopyOnWriteArrayList
当迭代次数远大于修改次数,使用该容器。每次修改都会复制底层的数组,他是Arraylist的一个线程安全变体,所有可变操作都通过对底层数组进行一次新的复制来实现,该过程一般都加锁。而这需要很大的开销,但当遍历操作的数量大大超过可变操作,这种方法就显得更加高效。...
2019-06-30 09:45:39 77
原创 arraylist和linkedlist的区别
1.ArrayList 的底层是数组,它可以以 O(1)时间复杂度对元素进行 随机访问 与此对应,LinkedList 是以元素列表的形式存储它的数据,查找某个元素的时间复杂度是 O(n)。2.相对于 ArrayList,LinkedList 的插入,删除操作速度更快,因为当元素被添加到集合 任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。3.对ArrayList和LinkedLi...
2019-06-28 20:40:08 90
原创 哪些是线程安全的容器?Hashmap和Hashtable的区别
Vector,HashTable,concurrentHashMap,copyonwriteArrayList是线程安全的。不同:第一,继承不同。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。第二,Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hash...
2019-06-28 20:15:13 377
原创 Hashmap是线程安全的吗?为什么
不是线程安全。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步。这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用Collections.synchronizedMap方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的非同步访问。在hashmap做put操作的时候会调用到以上的方法。现在假如A线程...
2019-06-28 20:09:19 5279
原创 hashmap的初始容量为什么选择16
首先,lengt为2的整数次幂的话,h&(length-1)相当于对length取模,既保证了散列均匀,又提升了效率。其次,length为2的整数次幂,保证了length-1最后一位是1,在与操作后可能出现两种结果。反之,最有一位只有可能为0。所以,这样能是hash值发生碰撞的概率较小,也能尽可能保证散列均匀。...
2019-06-28 19:36:36 871
原创 jdk7和jdk8hashmap的区别
jdk7中hashmap解决冲突采用链表,一旦hash碰撞过多时,可能会使得一个链表上存在多个节点,查找时花费0(n)jdk8解决了这个问题,在链表超过8个时采用红黑树的结构,提高了链表的查找速度为log(n)....
2019-06-28 19:04:29 666
原创 concurrentHashmap的实现,如何实现线程安全的
concurrentHashMap最主要特点是采用了分段锁技术,并发效果要比hashtable好一点。它的底层是一个segment数组,每个segment又链接了一个同hashmap类似的数据结构(1.7和1.8同样采用了不同的结构),由于segment继承了ReentrantLock,所以每个segment都可以加锁。它与hashmap的一些差异1.entry有一定的差异性,HashEntr...
2019-06-28 18:58:36 212
原创 请说出java中散列表,树所对应的容器。hashmap如何解决冲突
hashmap,hashtable,concurrentHashmap,hashset,treemap,treesethash冲突:就是根据key即经过一个函数f(key)得到的结果的作为地址去存放当前的key value键值对(这个是hashmap的存值方式),但是却发现算出来的地址上已经有人先来了。就是说这个地方被抢了啦。这就是所谓的hash冲突啦。1.开放定址法2.链地址法3.再哈希...
2019-06-28 18:31:40 253
原创 hashmap,linkedhashmap,treemap的区别
hashmap底层是(数组+链表+红黑树),访问速度快但遍历顺序不定linkedhashmap继承自hashmap但是底层维护了一个双向链表,所以可以
2019-06-28 10:57:43 154
转载 java的类加载机制
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading) 7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。加载、验证、准备、初始化和卸载这5个阶段的顺序是确定...
2019-06-20 21:46:34 75
原创 动态绑定和静态绑定
绑定、静态绑定、动态绑定的概念 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定。 静态绑定:在程序执行前方法已经被绑定,针对java简单的可以理解为程序编译期的绑定;java当中的方法只有final,static,private和构造方法是前期绑定 动态绑定在运行时根据具体对象的类型进...
2019-06-20 21:38:51 134
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人