java
文章平均质量分 87
晨初听雨
这个作者很懒,什么都没留下…
展开
-
Java多线程--- synchronized关键字
1. synchronized原理在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。不同线程对同步锁的访问是互斥的。也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“对象...原创 2018-09-09 10:35:58 · 443 阅读 · 0 评论 -
深入理解AQS(AbstractQueuedSynchronizer)
AbstractQueuedSynchronizer(AQS)是JDK中实现并发编程的核心,平时我们工作中经常用到的ReentrantLock,CountDownLatch等都是基于它来实现的。 AQS类中维护了一个双向链表(FIFO队列), 如下图所示: 队列中的每个元素都用一个Node表示,我们可以看到,Node类中有几个静态常量表示的状态:static...原创 2019-02-11 12:02:21 · 7349 阅读 · 3 评论 -
深入理解CountDownLatch原理
CountDownLatch简介CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownLatch和CyclicBarrier的区别(01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。(02) CountDownLatch的...原创 2019-02-11 16:11:51 · 3131 阅读 · 1 评论 -
深入理解ReentrantLock原理
一、前言 我们在分析ReentrantLock源码之前最好先了解AQS,因为ReentrantLock是基于AQS实现的。AQS源码分析在之前的博客已经进行了深入分析。传送门:深入理解AQS(AbstractQueuedSynchronizer)二、ReentrantLock数据结构 ReentrantLock的底层是借助AbstractQueuedSynchronizer实现,所...原创 2019-02-11 17:57:14 · 524 阅读 · 0 评论 -
深入理解CyclicBarrier原理
1、CyclicBarrier的简单概述现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。在JUC包中为我们提供了一个同步工具类能够很好的模拟这类场景,它就是CyclicBarrier类。利用CyclicBarrier类可以实现一组线程相互等待,当所有线程都到...原创 2019-02-11 22:57:57 · 45959 阅读 · 24 评论 -
深入理解Semaphore原理
1. 信号量Semaphore的介绍我们以一个停车场运作为例来说明信号量的作用。假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦。以后来的车必须在入口等待,直到停车场中有车辆离开。这时,如果有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开一辆,则又可以放入一辆,如此往复。在这个停车场系统中,车位是公共资源,每辆...原创 2019-02-12 10:28:13 · 776 阅读 · 0 评论 -
Spring事务的传播行为
一、事务的基本原理Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执行...原创 2019-02-18 11:15:21 · 281 阅读 · 0 评论 -
SpringMVC的工作流程
SpringMVC工作流程图: 1、用户发起请求到前端控制器DispatcherServlet,通过url-pattern过滤出哪些请求可以访问Servlet、哪些不能访问。并且会加载springmvc.xml配置文件。 2、前端控制器会找到处理器映射器(HandlerMapping),通过URL找到Handler,简单来说,就是将在springmvc.xml中配置的或者注解的URL与...原创 2019-02-18 20:43:15 · 252 阅读 · 0 评论 -
JVM参数配置大全
转自:http://www.cnblogs.com/edwardlauxh/archive/2010/04/25/1918603.html前阵子遇到几个面试题都是关于对Java内存控制的,因此从网上找到这篇文章,希望自己对Java的内存分配有重新的认识/usr/local/jdk/bin/java -Dresin.home=/usr/local/resin -server -Xms1800...转载 2019-02-28 16:27:40 · 135 阅读 · 0 评论 -
内存泄漏与内存溢出的区别
一、定义内存泄漏定义(memory leak):一个不再被程序使用的对象或变量还在内存中占有存储空间。一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。内存溢出定义(out of memory) :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内...原创 2019-02-14 11:46:41 · 200 阅读 · 0 评论 -
多台服务器共享session
多台服务器共享session问题在现在的大型网站中,如何实现多台服务器中的session数据共享呢 当使用多台服务器架设成集群之后,我们通过负载均衡的方式,同一个用户(或者ip)访问时被分配到不同的服务器上,假设在A服务器登录,如果在B服务器拿不到用户的登录信息session。这时访问到B服务器时就出现未登录情况。 所以如何对于这种情况做到共享session至关重要。...原创 2019-07-07 16:41:08 · 192 阅读 · 0 评论 -
Spring面试题整理
1、Spring是什么Spring是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。2、Spring有什么优点1、轻量级(相对应EJB来说) 2、使用Spring的IOC容器,将对象之间的依赖关系交给Spri...原创 2019-07-03 16:34:21 · 268 阅读 · 0 评论 -
Collections工具类源码解析
在Java集合框架中,还有两个经常用到的工具类:Collections和Arrays。顾名思义,Collections是用来操作集合的工具类,而Arrays是用来操作数组的工具类。这两个工具类提供了许多用于各自操作的静态方法。本篇文章,我们先来学习一下Collections工具类。构造方法和属性private Collections() {}构造方法私有,说明不对外提供,一般...原创 2019-01-22 15:49:31 · 319 阅读 · 0 评论 -
Java中的初始化块和构造器的执行顺序
我们都知道java中不但有构造器,还有初始化块和静态初始化块的概念,今天我们就来看看他们之间的执行顺序是怎样的。我们来看一个例子:package test;class Root { static { System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通初始化块"); } public ...原创 2018-10-15 14:54:20 · 924 阅读 · 1 评论 -
fail-fast和fail-safe详解
一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。 原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount...原创 2018-10-15 16:49:47 · 372 阅读 · 0 评论 -
List、Set和Map的遍历方式
ArrayList遍历 //第一种遍历方式:利用下标遍历 4 System.out.print("for循环的遍历方式:"); 5 for (int i = 0; i < lists.size(); i++) { 6 System.out.print(lists.get(i)); 7 ...原创 2018-08-27 18:12:15 · 341 阅读 · 0 评论 -
Set、List、Map的区别与联系,及面试重点问题
Set、List、Map的区别List 1.可以允许重复的对象。 2.可以插入多个null元素。 3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。 4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 Li...原创 2018-08-27 18:03:02 · 8353 阅读 · 0 评论 -
Object类clone方法深度解析
首先我们来看下clone方法的源码protected native Object clone() throws CloneNotSupportedException;通过源代码可以发现几点:clone方法是native方法,native方法的效率远高于非native方法,因此还是使用clone方法去做对象的拷贝而不是使用new的方法,copy。 此方法被protected修饰。这...原创 2018-10-28 17:07:23 · 893 阅读 · 0 评论 -
深入理解Java序列化和反序列化
序列化是一种对象持久化的手段。普遍应用在网络传输、RMI等场景中。本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到以下几个问题:怎么实现Java的序列化为什么实现了java.io.Serializable接口才能被序列化transient的作用是什么怎么自定义序列化策略自定义的序列化策略是如何被调用的ArrayList对序列化的实现有什么好...原创 2018-11-04 21:20:40 · 312 阅读 · 0 评论 -
ArrayList源码分析(JDK1.8)
ArrayList简介ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。 ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍...原创 2018-11-15 14:17:53 · 354 阅读 · 0 评论 -
LinkedList源码分析(JDK1.8)
LinkedList简介LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 LinkedList 实现 List 接口,能对它进行队列操作。 LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。 LinkedList 实现了Cloneable接口,即覆盖了函数clo...原创 2018-11-15 15:14:44 · 237 阅读 · 0 评论 -
HashMap源码分析(JDK1.8)
一、HashMap简介基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许key和value为null(但是只能有一个key为null,且key不能重复,value可以重复)。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 此实现假定哈希函数将元素适当地分布在各桶之间,可为基...原创 2018-11-16 11:41:16 · 734 阅读 · 0 评论 -
Iterator和Enumeration的区别
第一部分在Java集合中,我们通常都通过 “Iterator(迭代器)” 或 “Enumeration(枚举类)” 去遍历集合。今天,我们就一起学习一下它们之间到底有什么区别。我们先看看 Enumeration.java 和 Iterator.java的源码,再说它们的区别。Enumeration是一个接口,它的源码如下:package java.util;public inte...原创 2019-01-22 01:19:52 · 770 阅读 · 0 评论 -
HashTable源码解析
Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。 Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能...原创 2019-01-22 01:46:04 · 141 阅读 · 0 评论 -
JVM的Client端和Server端的区别
JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升。JVM工作在Server模式下可以大大提高性能,Server模式下应用的启动速度会比client模式慢大概10%,但运行速度比Client VM要快至少有10倍。当不指定运行模式参数时,虚拟机启动检测主机是否为服务器,如果是,则以Server模式启动,...原创 2019-07-31 16:02:02 · 2454 阅读 · 0 评论