
JAVA
IT_YangKun
此博客停止更新,可以关注我新博客地址。https://juejin.im/user/578259398ac2470061f3a3fb/posts
展开
-
ThreadPoolExecutor原理及使用
ThreadPoolExecutor原理及使用标签: java2014-11-04 11:22 8864人阅读 评论(0) 收藏 举报 分类:java(2) 版权声明:本文为博主原创文章,未经博主允许不得转载。目录(?)[+]大家先从ThreadPoolExecutor的总体流程入手: 针对Th原创 2016-10-06 23:25:42 · 365 阅读 · 0 评论 -
java常用的三种线程池
java常用的线程池有三种:newFixedThreadPool创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。原创 2016-10-05 22:33:13 · 1297 阅读 · 0 评论 -
NIO
NIOJava NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java1.4开始),Java NIO提供了与标准IO不同的IO工作方式。Java NIO: Channels and Buffers(通道和缓冲区)标准的俄IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从原创 2016-10-05 16:19:57 · 299 阅读 · 0 评论 -
可重入内置锁
可重入内置锁每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁。线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而,由于内置锁是可重入的,因此如果摸个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成原创 2016-10-05 16:18:46 · 248 阅读 · 0 评论 -
死锁
死锁当线程需要同时持有多个锁时,有可能产生死锁。考虑如下情形:线程A当前持有互斥所锁lock1,线程B当前持有互斥锁lock2。接下来,当线程A仍然持有lock1时,它试图获取lock2,因为线程B正持有lock2,因此线程A会阻塞等待线程B对lock2的释放。如果此时线程B在持有lock2的时候,也在试图获取lock1,因为线程A正持有lock1,因此线程B会阻塞等待A对lo原创 2016-10-05 16:18:08 · 244 阅读 · 0 评论 -
并发编程中实现内存可见的两种方法比较:加锁和volatile变量
并发编程中实现内存可见的两种方法比较:加锁和volatile变量volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制。从内存可见性的角度看,写入volatile变量相当于退出同步代码块,而读取volatile变量相当于进入同步代码块。原创 2016-10-05 16:17:41 · 860 阅读 · 0 评论 -
多线程环境中安全使用集合API
多线程环境中安全使用集合API在集合API中,最初设计的Vector和Hashtable是多线程安全的。例如:对于Vector来说,用来添加和删除元素的方法是同步的。如果只有一个线程与Vector的实例交互,那么,要求获取和释放对象锁便是一种浪费,另外在不必要的时候如果滥用同步化,也有可能会带来死锁。因此,对于更改集合内容的方法,没有一个是同步化的。集合本质上是非多线程安全的,当多个线原创 2016-10-05 16:16:50 · 275 阅读 · 0 评论 -
synchronized
synchronized在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确保在某一时刻,方法内只允许有一个线程。采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个monitor原创 2016-10-05 16:16:07 · 233 阅读 · 0 评论 -
守护线程与阻塞线程的四种情况
守护线程与阻塞线程的四种情况Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)用户线程即运行在前台的线程,而守护线程是运行在后台的线程。 守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程。当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,因原创 2016-10-05 16:15:14 · 454 阅读 · 0 评论 -
线程中断
线程中断使用interrupt()中断线程当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。这里需要注意的是,如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行。演示休眠线程的中断public class SleepInt原创 2016-10-05 16:14:36 · 242 阅读 · 0 评论 -
Thread和Runnable实现多线程的区别
Thread和Runnable实现多线程的区别Java中实现多线程有两种方法:继承Thread、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优势:可以避免由于Java的单继承特性而带来的局限增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的适合多个相同程序的线程区处原创 2016-10-05 16:13:49 · 381 阅读 · 0 评论 -
生产者和消费者问题
生产者和消费者问题package 生产者消费者;public class ProducerConsumerTest { public static void main(String[] args) { PublicResource resource = new PublicResource(); new Thread(new ProducerThr原创 2016-10-05 16:13:05 · 188 阅读 · 0 评论 -
Java并发
Java并发(Executor框架和多线程基础)Thread与Runable如何实现多线程Java 5以前实现多线程有两种实现方法:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnab原创 2016-10-05 16:11:51 · 302 阅读 · 0 评论 -
垃圾回收算法
垃圾回收算法引用计数法:缺点是无法处理循环引用问题标记-清除法:标记所有从根结点开始的可达对象,缺点是会造成内存空间不连续,不连续的内存空间的工作效率低于连续的内存空间,不容易分配内存复制算法:将内存空间分成两块,每次将正在使用的内存中存活对象复制到未使用的内存块中,之后清除正在使用的内存块。算法效率高,但是代价是系统内存折半。适用于新生代(存活对象少,垃圾对象多)标记-压缩算法:标记原创 2016-10-05 16:10:46 · 194 阅读 · 0 评论 -
虚拟机类加载机制
虚拟机类加载机制虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被Java虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。类从被加载到虚拟内存中开始,到卸载内存为止,它的整个生命周期包括了:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Ini转载 2016-10-05 16:09:36 · 163 阅读 · 0 评论 -
JVM
JVM内存模型以及分区,需要详细到每个区放什么。http://blog.youkuaiyun.com/ns_code/article/details/17565503JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。程序计数器(Program Counter Register)一块较小的内存空间,它是当转载 2016-10-05 16:09:00 · 321 阅读 · 0 评论 -
LinkedHashMap简介
LinkedHashMap简介LinkedHashMap是HashMap的子类,与HashMap有着同样的存储结构,但它加入了一个双向链表的头结点,将所有put到LinkedHashmap的节点一一串成了一个双向循环链表,因此它保留了节点插入的顺序,可以使节点的输出顺序与输入顺序相同。LinkedHashMap可以用来实现LRU算法(这会在下面的源码中进行分析)。Linke原创 2016-10-05 16:07:42 · 329 阅读 · 0 评论 -
Hashtable简介
Hashtable简介HashTable同样是基于哈希表实现的,同样每个元素都是key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阈值)时,同样会自动增长。Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。原创 2016-10-05 16:06:39 · 516 阅读 · 0 评论 -
HashMap简介
HashMap简介HashMap是基于哈希表实现的,每一个元素都是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阈值)时,同样会自动增长。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap实现了Serializable接口,因此它支持序列化,实现了原创 2016-10-05 16:05:44 · 436 阅读 · 0 评论 -
Vector简介
Vector简介Vector也是基于数组实现的,是一个动态数组,其容量能自动增长。Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全),可以用于多线程环境。Vector没有实现Serializable接口,因此它不支持序列化,实现了Cloneable接口,能被克隆,实现了Ran原创 2016-10-05 16:04:50 · 272 阅读 · 0 评论 -
LinkedList简介
LinkedList简介LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当作链表来操作外,它还可以当作栈,队列和双端队列来使用。LinkedList同样是非线程安全的,只在单线程下适合使用。LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆。Linked原创 2016-10-05 16:04:06 · 351 阅读 · 0 评论 -
ArrayList简介
ArrayList简介ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。ArrayList不是线程安全的,只能在单线程环境下,多线程环境下可以考虑用collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWr原创 2016-10-05 16:03:33 · 195 阅读 · 0 评论 -
Java集合
Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下五个部分:List列表、Set集合、Map映射、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)。Java集合类的整体框架如下:从上图中可以看出,集合类主要分为两大类:Coll原创 2016-10-05 16:02:50 · 173 阅读 · 0 评论 -
String源码分析
String源码分析从一段代码说起:public void stringTest(){ String a = "a"+"b"+1; String b = "ab1"; System.out.println(a == b);}大家猜一猜结果如何?如果你的结论是true。好吧,再来一段代码:public void stringTest(){原创 2016-10-05 16:01:42 · 175 阅读 · 0 评论 -
Java中的内存泄漏
Java中的内存泄漏1.Java内存回收机制不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请、引用、被引用、赋值等状况原创 2016-10-05 16:00:57 · 240 阅读 · 0 评论 -
J2SE
J2SE基础八种基本数据类型的大小,以及他们的封装类。八种基本数据类型,int ,double ,long ,float, short,byte,character,boolean对应的封装类型是:Integer ,Double ,Long ,Float, Short,Byte,Character,BooleanSwitch能否用string做参原创 2016-10-05 15:59:45 · 412 阅读 · 0 评论 -
经典面试题(不断更新中)
——————————————————————–史上最强面试题————————————————————————————-AIDL1、 要使用AIDL的前提的条件我们要只知道它是干什么的? #AIDL 也就是在Android中定义的一个语言,他是进行进程间通讯的一种实现方式,通过定义AIDL接口,可以实现进程间通讯机制2、 要知道它的使用步骤,前提条件?? #需求:比如现在有2个进程需原创 2016-10-05 02:59:51 · 8737 阅读 · 0 评论