Java基础知识巩固
文章平均质量分 76
西木风落
多年开发经验,专业、高效,致力于更好的自己
展开
-
JAVA中的迭代器iterator
一、迭代器Iterator1、迭代器模式主要是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节。2、JAVA迭代器的由来在Java集合框架的集合类中,容器有很多种,比如ArrayList,LinkedList、HashSet等等,每一种容器底层可能都有不同的实现,需要有一种实现,使得客户端自身不需维护集合的内部结构就能遍历集合,Iterator随之诞生...原创 2020-04-10 16:15:11 · 975 阅读 · 0 评论 -
Java中Xml文件和Bean互相转换
JAXB(Java Architecture for XML Binding) 是一个业界的标准,可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处...原创 2019-12-04 14:06:38 · 3029 阅读 · 0 评论 -
Java中的锁(四)
基于前面讲解的CAS内容,本章主要内容是Lock以及Lock的常见实现加锁原理和方式。一、Lock接口Java1.5以后官方在concurrent包下引入了Lock接口和其对应实现。Lock接口是显示的锁,加锁和解锁都需要手动实现,接口内容有:public interface Lock { void lock(); //可中断获取锁,在获取锁的过程中可中断,syn...原创 2018-12-06 20:18:46 · 329 阅读 · 0 评论 -
java 逃逸分析
在编译期间,JIT 会对代码做很多优化,其中有一部分优化的目的就是减少内存堆分配的压力,其中一项重要的技术叫做逃逸分析。通过逃逸分析,HotSpot 编译器能够分析出一个新的对象的引用的使用范围,从而决定是否要将这个对象分配到堆上。 方法逃逸 逃逸分析基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能会被外部方法调用,例如作为调用参数传递到其他方法中,称为方法逃逸。 ...原创 2018-12-16 16:12:13 · 339 阅读 · 1 评论 -
Java8 新特性指导手册
java8有很多新的特性,这些特性给coding带来了很多便利。接下来会介绍一下java8的新特性使用。// 1、lambda表达式public void test0() { List<String> list = Arrays.asList("a", "bg", "cc"); Collections.sort(list, new Comparator&...原创 2019-01-29 15:48:30 · 258 阅读 · 0 评论 -
java内存模型(一)
在介绍Java内存模型之前,我们回顾一下计算机的内存模型,因为Java很多的并发操作和计算机的内存模型息息相关。一、计算机硬件内存模型现代CPU的运算速度远远高于物理内存的读写速度,但处理器在运算的过程中,又避免不了与内存的读写交互,所以很多时候会出现处理器要等待内存数据读写完成后才能进行下一步运算。为了提高处理器的运算速度,现在的计算机系统为处理器添加了一层读写速度接近CPU运算速度的缓...原创 2019-03-24 15:44:34 · 138 阅读 · 0 评论 -
Java文件读取
常见的文件读取方式:public class ReadFile{ public void readFileByBytes(String fileName){ File file = new File(fileName); InputStream in = null; try{ in = new FileInputStream(file); int ...原创 2019-03-24 16:49:38 · 155 阅读 · 0 评论 -
深入理解jvm(四)
基于前面三篇关于jvm的理解,再次进一步研究jvm的其它特性:一、什么是JVMJVM(Java Virtual Machine),Java虚拟机,它是JRE的一部分,通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM的内部体系结构分为三部分:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。类加载器:每一个JVM都有一个类加载器子系统,负责将程序加载到JVM中...原创 2019-08-18 20:49:26 · 548 阅读 · 0 评论 -
java中的锁(一)
1、锁的作用 在java中,多线程在获取资源的时候,如何保证资源获取的有序性和占用形,是通过锁来控制的。2、锁的设计思路在设计思路上,锁分为乐观锁和悲观锁。乐观锁:每次拿数据的时候都认为别人不会修改,所以不会上锁;更新数据的时候,判断一下别人有没有更新,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。 悲...原创 2019-09-21 16:36:04 · 1678 阅读 · 0 评论 -
java中的锁(二)
本章主要深入讲解synchronized关键字。一、synchronized关键字的使用synchronized关键字是JVM层面实现的锁,常见的使用方式有: 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁。 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁。 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获...原创 2019-09-22 23:54:22 · 421 阅读 · 0 评论 -
Java中的锁(三)
本章主要内容集中在CAS无锁和对应的常见CAS封装实现。一、无锁的概念无锁是一种乐观策略,对于加锁的并发编程,总认为每次访问共享资源会冲突,所以必须对每一次数据操作做加锁。而无锁认为访问共享数据时,不会有冲突,无需加锁,发现冲突后,会用CAS技术来保证线程数据的安全性,所以CAS是无锁策略的关键实现。二、什么是CASCAS全称是Compare And Swap,包含3个参数V...转载 2019-09-25 00:26:49 · 133 阅读 · 0 评论 -
Java中的锁(四)续
上一章中说到了AbstractQueuedSynchronizer,其内部有一个ConditionObject类,包含了Condition接口的实现。五、Condition接口condition相对于wait和notify,更加灵活,可以用多个condition实例对一个lock控制,通过condition可以更精细的控制多线程的休眠和唤醒。condition接口提供的方法:publ...原创 2019-10-02 21:48:07 · 156 阅读 · 1 评论 -
Java中的锁(五)
本章主要介绍Java中semaphore的使用和底层实现原理。一、semaphore的基本概念semaphore又叫信号量,在Java1.5中引入,是用来控制同时访问共享资源的线程数量,通过协调各个线程,以保证合理的使用资源。semaphore底层是通过AQS实现线程管理的,提供两个构造函数,实现公平和非公平共享信号量。//非公平信号量,同时可以允许多少线程(许可)进行访问,和线程等...原创 2019-10-05 19:15:24 · 156 阅读 · 0 评论 -
Java中的锁(六)
本章会针对同步屏障CyclicBarrier的使用和底层实现做介绍。一、CyclicBarrier基本概念CyclicBarrier,意思就是可以循环使用的屏障,在concurrent包下,该工具类可以做到让一组线程到达一个屏障点的时候被阻塞,直到最后一个线程到达才开启屏障,继续往下执行。CyclicBarrier有两个构造函数:CyclicBarrier(int partie...原创 2019-10-05 23:13:31 · 96 阅读 · 0 评论 -
Java中的锁(七)
本章主要介绍Java中的计数器CountDownLatch。一、CountdownLatch的基本概念countdownLatch也叫闭锁,与cyclicBarrier一样,也是在jdk1.5中的并发包引入的。CountDownLatch内部会维护一个初始值为线程数量的计数器,主线程执行await方法,如果计数器大于0,则阻塞等待。当一个线程完成任务后,计数器值减1。当计数器为0时,表示所...原创 2019-10-06 22:39:03 · 210 阅读 · 0 评论 -
java中的并发阻塞队列ArrayBlockingQueue/LinkedBlockingQueue
本章主要介绍Java中ArrayBlockingQueue/LinkedBlockingQueue阻塞队列。一、阻塞队列的基本特点阻塞队列和普通队列ArrayList/LinkedList主要的不同点,在于阻塞添加:当队列元素存满时,会阻塞加入元素的线程,直到队列不满时才会重新唤醒; 阻塞删除:当队列元素为空的时候,会阻塞删除元素的线程,直到队列中有元素后才会被唤醒。Java中,A...原创 2019-10-07 17:47:21 · 274 阅读 · 0 评论 -
Java并发编程——线程池
使用线程池管理线程有如下优点:1)降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2)提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。3)提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。原创 2016-09-27 14:07:22 · 366 阅读 · 1 评论 -
修改集合抛出java.util.ConcurrentModificationException
一、问题引出在对集合进行迭代的时候,会想动态对集合做修改(add/remove)操作,如下: for(JobItem i:jobItemList){ if(item.getJobId() == i.getJobId()){ jobItemList.remove(i); } }运行程序,会抛出异常 java.util.ConcurrentModification...原创 2016-09-28 10:51:38 · 331 阅读 · 0 评论 -
Java String 变量的内存模型
Java中对于String 类型变量声明有两种方式:1、 String str1 = "abc";2、 String str2 = new String("abc");这两种方式有什么不同呢?第一种方法:引用str1被存放在栈区,字符串常量"abc"被存放在常量池,引用str1指向了常量池中的"abc"(str1中的存放了常量池中"abc"的地址);第二种方法:引用str2被存...原创 2016-10-31 10:29:20 · 1238 阅读 · 1 评论 -
java 中读写锁的使用
Java中synchronized关键字和Lock的区别与关联:1、 synchronized的实现是由JVM来控制的,而synchronized不论是修饰方法还是同步代码块,拿到的都是对象的锁。当synchronized修饰的是方法时,synchronized所拿到的是调用该方法的对象的锁,一般情况下都是this的锁;当synchronized()修饰的同步代码块时,sync原创 2017-04-25 00:08:54 · 3035 阅读 · 0 评论 -
Java 阻塞队列实现
阻塞队列概念:阻塞队列与普通队列的区别是:当阻塞队列为空的时候,从队列取数会被阻塞,直到队列中有数线程才会被唤醒;如果队列已满,往队列存数线程也会被阻塞,直到队列非满线程才会被唤醒。简单的阻塞队列实现有:public class SimpleBlockQueue { private int size = 0; private List list = null;原创 2017-05-10 00:00:37 · 287 阅读 · 0 评论 -
深入理解jvm(三)
前面我们了解完整个JVM的内存结构,Java对象的内存分配,现在说说Java中类是怎么加载的。一、什么是ClassLoader”.java”文件经过Java编译器编译后,生成.class文件,.class文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载...原创 2017-02-27 11:15:14 · 334 阅读 · 0 评论 -
java 锁全面解析(一)
熟悉Java使用的coder都知道,Java程序离不开多线程,而涉及到多线程时,就需要考虑资源的共享性问题,最终这一切都逃不过锁的命运。本次主要对Java中的锁做一些总结,包括:一、Java内置锁synchronized二、JDK 5中提供的java.util.concurrent.lock包中的Lock对象三、Java ThreadLocal为什么需要锁,相信小伙伴们都知道了,所原创 2017-09-06 20:00:32 · 553 阅读 · 0 评论 -
java 锁全面解析(二)
接着上篇java 锁全面解析(一)四、java.util.corrent包Lock接口及其实现提供了与synchronized关键字类似的同步功能,与synchronized关键字相比,缺少了隐式释放锁的便捷,但是拥有锁获取和释放的可操作性、可中断的获取锁以及超时获取锁等多种同步特性。1、Lock具备的特性1)尝试非阻塞地获取锁2)能被中断的获取锁3)超时获取锁常见的使原创 2017-09-06 20:25:16 · 393 阅读 · 0 评论 -
java并发编程——多线程
本章主要介绍java中多线程并发编程基础知识,包括的内容有:进程,线程,协程的区别 多线程的实现方式 线程中断和优先级 线程状态的切换一、进程、线程和协程1.1 进程、线程和协程进程是资源分配的最小单位,操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源)。进程拥有自己独立的堆和栈,既不共享堆,也不共享栈。线程是CPU调度的最小单位,线程有自己的堆栈和局部变量,...原创 2017-03-27 15:22:26 · 730 阅读 · 1 评论 -
深入理解jvm(二)
上篇中了解完JVM的内存结构,对象的内存分配和垃圾回收后,本篇主要基于JVM的内存参数调优:一、jvm参数调优 在JVM启动参数中,可以设置跟内存、垃圾回收相关的一些参数设置。通过设置我们希望达到一些目标:GC的时间足够的小 GC的次数足够的少 发生Full GC的周期足够的长 GC时间和GC次数调优是相悖的,要想GC时间小必须要一个更小的堆,要保证GC次数足够少,必须保证一...原创 2017-04-20 00:06:27 · 272 阅读 · 0 评论 -
java中的代理
对于java业务而言,通常会把主体业务和枝节性代码分开,比如做数据库更新的时候,会把事务的管理和真正的业务逻辑分开,这样既提高了管理类的使用效率,也降低了管理类和业务的耦合。类似的情况还有日志记录、信息监管等。代理模式:为其它对象提供一种代理以控制对这个对象的访问。代理模式的角色:抽象角色:声明真实对象和代理对象的共同接口代理角色:代理对象内部包含有真实角色的引用,从而可以操作真实原创 2017-10-18 10:26:03 · 652 阅读 · 0 评论 -
深入理解jvm(一)
使用Java的同学都知道,Java语言有两个特点:一次编译,到处运行;不需要手动释放内存。为什么能做到这一点呢?这一切都归功于Java的虚拟机JVM。接下来,我们就聊聊JVM。一、啥是JVMJVM,又称java虚拟机,其作用是充当操作系统的翻译官,能够将.class文件传递给操作系统运行,是JRE的组成部分。JVM的生命周期起始与main方法,这个方法必须是public,接受一个字符串数组...原创 2016-08-16 11:15:17 · 500 阅读 · 0 评论 -
如何排查线上Java程序运行情况
项目上线后,不可能有debug模式,所以会长借助一些工具帮忙分线线上的运行情况,这些运行时信息包括但不限于运行日志、异常堆栈、堆使用情况、GC情况、JVM参数情况、线程情况等。主要介绍一些常见的分析命令:1. jpsjps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号。非常关键的一点:jps会查找当前用户权限下的所有java进程。 jps -v 输出传递给J...原创 2018-04-07 19:04:08 · 1294 阅读 · 0 评论 -
单例模式介绍
1、什么是单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。2、单例模式有什么好处对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。3、为什么不使用全局变量 如果对象非常消耗资源,并且程序某次的执行中一直没用,这样...原创 2018-05-27 18:13:33 · 299 阅读 · 0 评论 -
http中getParameter和getAttribute的区别
最近项目中有用到从HttpServletRequest中获取参数的用法,通过request.getParameter()和request.getAttribute()都能获取到request中的参数,这两种有何区别?request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。request.getParameter()方法返回Strin...原创 2018-06-26 09:38:27 · 2473 阅读 · 0 评论 -
java工具类——Collections.unmodifiableList
有时候,我们希望对list中对象具有不可变性,尤其是对list的add或者remove操作。普通的list不能满足这个需求,用到工具类Collections.unmodifiableList方法,传入一个list,返回的是list的一个视图,之后对list进行add、remove等改变其内容的操作将导致编译不通过。...原创 2018-07-13 15:04:39 · 343 阅读 · 0 评论 -
java 中System.gc和finalize方法
1.finalize()介绍finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。 finalize()与C++中的析构函数不是对应的,但Java中的finalize的调用具有不确定性。 finalize方法在垃圾回收器准备垃圾回收前被调用,但是不一定会被调用 finalize()其实是用来释放不是通过jav...原创 2018-06-18 19:36:53 · 2518 阅读 · 0 评论