![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
菜瓜_牛顿
枪如惊雷,照一身肝胆
展开
-
*线程中断
interrupt,interrupted,isInterruptedinterrupt()形式上中断一个线程,不会去真正的打断正在运行的线程,而是修改这个线程的中断标志位(interrupt status)。对于处在sleep()、wait()和join()方法阻塞下的线程,该方法会使线程抛出InterruptedException实现了 InterruptibleChannel 接口的类中的一些 I/O 阻塞操作,如 DatagramChannel 中的 connect 方法和 receive原创 2021-08-13 18:47:07 · 160 阅读 · 0 评论 -
一些杂七杂八的知识点
重写和重载重写:override,子类重写父类的方法,参数列表和返回值都不便,Java多态特性的一种表现。 private , final , static 三种方法不能被重写。重载:overload, 在同一个类中,有多个方法名相同,参数列表不同(参数个数不同,参数类型不同),与方法的返回值无关,与权限修饰符无关。编译器通过对方法签名的识别即可静态编译出不同的方法。这也是java中重载与重写的区别之一。重载只是一种语言特性,与多态无关,与面向对象也无关。多态是为了实现接口重用Objecto原创 2021-07-29 23:00:45 · 170 阅读 · 0 评论 -
*ThreadLocal 详解
ThreadLocal是什么ThreadLocal可以理解为线程局部变量,当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本,ThreadLocal保证了各个线程的数据互不干扰。ThreadLocal原理public void set(T value) { Thread t = Thread.currentThread(); Thread.原创 2020-05-28 17:43:42 · 145 阅读 · 0 评论 -
*AQS详解
前言AQS即AbstractQueuedSynchronizer ,提供加锁解锁的一套模板,具体实现细节由子类实现,可以通过"三板斧"的辅助概念来理解:状态 status 队列 queue cas状态 stateprivate volatile int state;//同步状态变量state为整个AQS的核心,是全局共享的一个状态,为保证其修改的可见性,一般用volatil...原创 2020-01-02 21:51:44 · 425 阅读 · 0 评论 -
ConcurrentHashMap JDK1.8
《Java源码分析》:ConcurrentHashMap JDK1.8最近一直在看关于J.U.C中的源码,了解原子操作,了解锁机制,了解多线程并发等等。但是ConcurrentHashMap一直拖着到今天才算告一段落。点击打开链接也要感谢ConcurrentHashMap这个类,刚开始就是想弄懂里面的工作原理,但是,无奈看了网上关于介绍ConcurrentHashMap原创 2017-08-18 09:36:43 · 551 阅读 · 0 评论 -
CountDownLatch同步计数器
CountDownLatch类是一个同步计数器可看作一个倒计数的锁存器,构造时传入初始值int参数,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序继续执行。当计数减至0时触发特定的事件。利用这种特性,可以让主线程等待子线程的结束。 应用场景是:一个任务想要往下执行,但要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续往下执行原创 2017-06-23 14:44:40 · 248 阅读 · 0 评论 -
Java多线程相关问题
1. 进程和线程之间有什么不同?一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。2. 多线程编程的好处是什么?在多线程程序中,多个线程被并发的执行以提高程原创 2017-04-21 11:05:40 · 266 阅读 · 0 评论 -
ForkJoinPool
1、fork/join模式fork:分割,将一个大任务分割成多个小任务,比如1加到100亿,可以分成100个小任务,每个小任务统计1亿个数相加join:合并,将小任务的结果合并成最终的结果,比如将上述100个子结果相加,就是最终结果。fork/join模式采用的算法:工作窃取算法 work-stealing优点:充分利用了线程进行并行计算,减少线程间竞争缺点:当只有队列中只原创 2017-04-07 16:50:22 · 586 阅读 · 0 评论 -
*线程池介绍
1、线程池和线程组 ThreadGroup 和 ThreadPoolExecutorThreadGroup:(1)一个线程的集合,线程组也可以包含其他线程组,构成一颗线程树,在树中除了初始线程组外,每个线程组都有一个父线程组。(2)允许线程访问自己线程组的信息,但不允许访问其他线程组的信息;线程消耗包括内存和其他资源换在内的大量资源。(3)除了Thread对象所需的内存对象外,每个相乘都原创 2017-03-30 20:27:42 · 359 阅读 · 0 评论 -
线程组ThreadGroup
1、可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织线程必须启动后才能归到指定线程组中。 没有指定线程组,那么自动归到当前线程所属的线程组中根线程组就是系统线程组system2、ThreadGroup threadGroup1 = new ThreadGroup("group1");ThreadGroup threadGroup原创 2017-03-30 16:26:21 · 801 阅读 · 0 评论 -
BlockingDeque阻塞双端队列
1.BlockingDeque:(1)队满时 插入线程阻塞,队空时取出线程阻塞。(2)当线程即是一个队列的生产者又是消费者时用到双端阻塞队列主要方法: 常用的put和take 抛异常特定值阻塞超时插入addFirst(o)offerFirst(o)putFirst(o)offerFirst(o, timeo原创 2017-03-29 20:41:48 · 972 阅读 · 0 评论 -
线程通信--阻塞队列
1、BlockingQueue( 阻塞队列):当生产者试图向BlockingQueue中放入元素时,如果该队列已满,则该线程被阻塞,当消费者试图从队列中取出元素,当队列为空时阻塞。主要方法:2、(1)法向BlockingQueue中插入null,否则抛出NullPointerException(2)不仅可以操作对头和队尾元素,也可以是中间的,比如remove()中间某个原创 2017-03-29 20:21:43 · 383 阅读 · 0 评论 -
ReentrantReadWriteLock
1.(1)读操作(共享锁)之间不互斥,写操作(排他锁)之间互斥,读和写操作之间互斥,提高ReentrantLock的效率(2)可重入:按照ReentrantLock样式重新获取读写锁,但是在写入线程保持的写入锁释放后,才允许重入读线程(3)锁降级:写线程可以获得读取锁,即先获得写入锁再获得读锁,释放时先读后写,但是从读取锁升级到写入锁是不可能的(4)中断:读和写锁都支持获取期间中断原创 2017-03-29 13:34:09 · 182 阅读 · 0 评论 -
ReentrantLock和Condition
1.ReentrantLock:jdk1.5中的ReentrantLock类也能达到同步的效果,并且相比于synchronized功能更强大,比如具有嗅探锁定、多路分支通知。ReentrantLock 将由最近成功获得锁,并且还没有释放该锁的线程所拥有。当锁没有被另一个线程所拥有时,调用lock 的线程将成功获取该锁并返回。如果当前线程已经拥有该锁,此方法将立即返回。可以使用 is原创 2017-03-29 11:41:59 · 832 阅读 · 0 评论 -
join
1.作用b.join()使得当前线程进入无限阻塞状态,直到线程b运行完后,当前线程才继续执行后面的程序。2.join、synchronized、sleepjoin内部是由wait实现的,所以当调用时会立即释放锁,而synchronized采用的是同步监视器,对对象做同步原理Thread.sleep()是线程类方法,在调用后不会释放锁join和Thread.sleep在中断状态为原创 2017-03-27 11:11:50 · 314 阅读 · 0 评论 -
管道进行线程通信
1.pipedInputStream/pipedOutStream:管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作原创 2017-03-27 10:47:28 · 448 阅读 · 0 评论 -
线程通信---1.wait/notify
1.多线程共同访问同一个变量,这种通信机制不是“等待/通知”,两个线程完全主动式的读取一个共享变量,在花费读取的时间基础上,读到的值是不是想要的,并不能完全确定。2.释放锁的情况:(1)线程运行完(run或call方法执行完)(2)遇到break,return,会继续执行本线程后面相关的程序,释放锁(3)调用wait方法,进入阻塞状态(4)发生Error或者Exce原创 2017-03-26 15:24:20 · 282 阅读 · 0 评论 -
volatile二三事2---非原子性
1.原子性:一次操作是不可分割的,常见的能保证原子性的操作有院子类AtomicInteger、AtomicLong等在i++过程,载入Lock,synchronized,而volatile是非原子性的。Java要求load read assign use store write lock unlock 8项操作是原子的,但是对于64位的long和double,允许jvm将没有vola原创 2017-03-24 21:10:25 · 676 阅读 · 0 评论 -
volatile
1.主内存和工作内存每个线程有自己的工作内存(线程栈),在调用主内存(公共内存)变量时,先将变量拷贝到工作内存,然后在私有内存中进行读写,而不是直接操作主内存中的数据。这样在多线程下就会有线程安全问题出现。内存见的交互操作如下图,下面8个是原子操作当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副原创 2017-03-23 22:03:16 · 351 阅读 · 0 评论 -
suspend和resume弊端
1、suspend将线程挂起,运行->阻塞;调用后并不释放所占用的锁resume将线程解挂,阻塞->就绪2、suspend和resume这两种方法不建议使用,因为存在很多弊端。(1)独占:因为suspend在调用过程中不会释放所占用的锁,所以如果使用不当会造成对公共对象的独占,使得其他线程无法访问公共对象,严重的话造成死锁。下面的例子便于理解 只列举部分代码,应该可以看得明白原创 2017-03-22 21:05:04 · 4147 阅读 · 0 评论 -
停止线程--异常法
停止线程可以利用循环,标志位方法之外,也可以结合循环和interrupt方法,看下面两个例子class Thread1 extends Thread{ public void run(){ for(int i=0;i<50000;i++){ if(this.interrupted()){ System.out.println("已经停止状态,线程退出"); brea原创 2017-03-22 11:30:18 · 1412 阅读 · 1 评论 -
*线程的基本概念
1.线程的声明周期:新建就绪 运行 阻塞 死亡(1)新建:new创建一个线程后 ,它就进入了新建状态。这个状态仅仅有jvm为其分配内存,并初始化成员变量的值。(2)就绪:调用start后线程进入就绪状态。jvm为其创建方法调用栈和程序计数器,处于这个状态的线程实际上并没有开始运行,只是可以运行了,到底何时运行要看什么时候能获得处理器资源。(3)运行:就绪状态的线程获得了CPU原创 2017-03-21 20:14:21 · 420 阅读 · 0 评论 -
线程创建2---Callable和Future
1.Callable接口Callable接口Java 5新增的一种具有类型参数的泛型,它的参数类型和call()返回的类型相同,call方法可以有返回值可以抛出异常。Callable接口不是Runnable的子接口,所以它不能直接作为Thread 的target,而且call方法不是直接调用,而是被线程体调用。2.Future模式理解:我有一个任务,我提交给Future,Futur原创 2017-03-21 17:38:06 · 579 阅读 · 0 评论 -
线程创建Thread和Runnable
1.线程创建(1)通过继承Thread类来创建线程,在执行时new MyThread() .start()(2)通过实现Runnable接口来创建线程,在执行时 MyThread mt=new MyThread(); new Thread(mt).start();2.Thread和Runnabel两种创建方式的区别:(1)Runnable接口的实例是Thread的target,原创 2017-03-21 15:43:41 · 6429 阅读 · 0 评论 -
新版本JDK新增特性
Java 12switch 表达式 : switch不仅可以作为语句,也可以作为表达式,简化代码 JVM 常量API 新增了常量操作 G1 的可中断 mixed gc 将mixed gc 拆分为强制部分和可选部分,是g1更有效的终止垃圾回收过程。通过垃圾回收过程优先处理强制部分,g1可以满足更多的暂停时间目标。 G1垃圾收集器的主要目标之一是满足用户设置的暂停时间。G1采用一个分析引擎来选择在收集期间要处理的工作量。此选择过程的结果是一组称为GC集的区域。一旦GC集建立并且GC已.原创 2020-06-11 14:05:41 · 225 阅读 · 0 评论 -
HashMap 和 ConcurrentHashMap 从头到尾
HashMap1.JDK7 中 HashMap底层实现1.1 基础结构数组+链表1.2 核心成员modCount记录Map新增 删除 k-v对,或者内存结构做出调整的次数,其主要作用是对Map的 iterator() 操作做一致性校验,如果在iterator操作的过程中,Map 的数值有修改,直接抛出ConcurrentModificationException异常。1.3 put()put 方法是有返回值的 oldValue 或者 null,put 的流...原创 2020-06-08 11:39:22 · 328 阅读 · 0 评论 -
乐观锁 悲观锁 自旋锁 偏向锁
乐观锁在每次读取数据时都认为别人不会修改该数据,所以不会上锁,但在更新时会判断在此期间别人有没有更新该数据,通常采用在写时先读出当前版本号然后加锁的方法。具体过程为:比较当前版本号与上一次的版本号,如果版本号一致,则更新,如果版本号不一致,则重复进行读、比较、写操作。Java中的乐观锁大部分是通过CAS(Compare And Swap,比较和交换)操作实现的,CAS是一种原子更新操作,在对数据操作之前首先会比较当前值跟传入的值是否一样,如果一样则更新,否则不执行更新操作,直接返回失败状态。悲观原创 2020-05-28 14:11:51 · 523 阅读 · 0 评论 -
synchronized关键字
1相关介绍 对象结构 对象头 Mark Word (标记字段):hashcode,锁标志位,分代年龄 Class point (类型指针):对象指向它的类元素指针 实例数据:数据信息,父类信息 对其填充:其实对象必须8字节对齐,不够的填充,所以一个空对象也就是8字节大小。 特性 有序性: 可见性: 原子性: 可重复入性:synchronized 锁对象的时候有个计数器,记录下线程获取锁的次数,获锁+1,执行完-1,直到清零 就是释放锁 不可中断原创 2020-05-20 16:58:02 · 234 阅读 · 1 评论 -
CAS
1.CAS简介:CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。非阻塞算法 :一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。现代的CPU提供了特殊的指令,可以自动更新共享数据,而且能够检测到其他线程的干扰,而 compareAndSet() 就用这些代替了锁定。拿出AtomicInteger原创 2017-08-18 09:13:42 · 363 阅读 · 0 评论 -
Integer的拆箱装箱
- boolean,char,byte,short,int,long,float,double - 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,DoubleInteger与int的区别最基本的是:Ingeter是int的包装类,int的初值为0,Ingeter的初值为null1.自动拆箱比较为true原创 2017-08-06 13:02:07 · 377 阅读 · 0 评论 -
foreach循环和内存中的数组
1.首先说一下foreach循环:当使用foreach来迭代访问数组元素时,循环变量book相当于一个临时变量,系统会把数组元素依次赋给这个变量,当时对该变量的修改,并不能改变原数组元素的值。此处还记得Iterator来遍历吗,也是不能修改eg: for(Book book: books){book="哈哈哈";System.out.println(book);//输出“哈哈原创 2017-08-07 08:08:44 · 1122 阅读 · 0 评论 -
Preconditions和Assert
一 Preconditions1.作用:主要用在业务逻辑前,进行代码检验,避免过多的if语句2.API:常用的Preconditions.checkNotNull(XXX)和Preconditions.checkArgument(XXX)方法声明(不包括额外参数) 描述 检查失败时抛出的异常 checkArgument(boolean) 检查boolean是否...原创 2018-07-20 15:07:29 · 1323 阅读 · 0 评论 -
关于finally
用于异常处理(1)try/catch中有return,finally在return之前执行。(2)Finally不一定会执行:1)在跟着的try块之前出现异常(如 int x=5/0;),那么这个finally就不执行2)在try或者catch中有System.exit()强行退出,finally也不执行。(3)如果finally里有return语句,它会覆盖掉try或者cat原创 2017-06-27 09:32:36 · 421 阅读 · 1 评论 -
Java反射机制
Java反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。(1)JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用对象的任意一个方法和属性;这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制。主要功能:在运行时:判断任意一个对象所属的类,构造任意一个类的对象,判断任意一个类所具原创 2017-06-29 09:23:26 · 241 阅读 · 0 评论 -
HashSet和TreeSet
对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码:(1)使用HashMap的key保存HashSet的元素。 public class HashSet extends AbstractSet implements Se原创 2017-08-10 11:43:02 · 420 阅读 · 0 评论 -
BIO与NIO、AIO的区别
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、BIO同步阻塞 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直原创 2017-06-29 17:06:52 · 290 阅读 · 0 评论 -
Java多态
1、多态:相同类型的变量调用同一个方法时表现出不同的行为特征,即编译时期和运行时期的情况不一样。2、多态实现:继承父类并重写其中的一些方法。3、Person类name, eat(),drink()成员和方法,子类Man中有name,并重写eat talk方法;对于 Person m=new Man()(1)成员变量不具有多态性,m.name实际上是person中的name(2)原创 2017-06-13 16:32:20 · 191 阅读 · 0 评论 -
Class类
一、认识Class类 反射机制允许在运行时发现和使用类型的信息。在Java中用来表示运行时类型信息的对应类就是Class类,也继承Object类其内声明了数个应该在所有Java类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class类的对象。Class类样继承自Object,其实体用以原创 2017-06-29 10:52:58 · 575 阅读 · 0 评论 -
值传递和引用传递
值传递:(形参类型是基本数据类型):方法调用时,实参把它的值传给形参,形参只是用实参的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形参值的改变不影响实参的值。引用传递:(形参类型是引用数据类型参数):方法调用时,实参是对象(或数组),这时实参与形参指向同一存储单元,因此对形参的修改实际就是对实参的修改。下面举例说明:传值---传递基本数据类型参数原创 2017-06-29 11:26:06 · 482 阅读 · 0 评论 -
URI、URL、URN
1、URI(uniform resource identifier):统一资源标识,用来唯一的标识一个资源。2、URL(locator):统一资源定位器,它是一种具体的URI,是URI的子集,即URI可以用来标识一个资源,而且还指明了如何locate这个资源3、URN(name):统一资源命名,通过名字来标识资源的,也是URI的子集,比如mailto:java=net@java.sun.原创 2017-04-17 09:41:43 · 367 阅读 · 0 评论