Java
Java
王逍遥大人
一个好人
展开
-
Java中父子线程的生死联系
Java中父子生死,有时息息相关,但有时却又没有关系,我们分为三种情况进行演示:父死-子不死父死-子瞬间死父想死提前告诉子-原创 2020-08-12 08:16:49 · 1218 阅读 · 1 评论 -
Java中线程同步的七种实现方式
文章目录一:volatile二:synchronized 临界区方式ReentrantLock/Condition 消息队列方式三:使用JUC工具类 CountDownLatch四:基本LockSupport实现线程间的阻塞和唤醒五:通过Socket网络通信六:信号量机制(Semaphore):包括无名线程信号量和命名线程信号量七:管道通信就是使用java.io.PipedInputStream 和 java.io.PipedOutputStream进行通信这篇博客是是我在学习了多线程并发和操作系统后,原创 2020-08-12 21:09:19 · 797 阅读 · 0 评论 -
Java中线程通信方式七种
文章目录volatile、synchronized、ReentrantLock/Condition 来实现线程间的通信这篇博客是是我在学习了多线程并发和操作系统后,针对Java中的情况,为保证线程安全和线程的并发运行进行总结的博客。看了我的博客后如果哪里我有理解不到位地方欢迎大家评论区给我留言,感谢支持。volatile、synchronized、ReentrantLock/Condition 来实现线程间的通信...原创 2020-12-25 23:14:40 · 10186 阅读 · 4 评论 -
JUC-AQS原理
文章目录利用AQS实现自定义不可重入锁AQS全名为AbstractQueuedSynchronizer ,它是阻塞式锁和相关同步工具的框架public abstract class AbstractQueuedSynchronizerextends AbstractOwnableSynchronizerimplements SerializableAQS特点用state属性来表示资源的状态(分为独占式和共享式),子类需要定义和维护这个状态,控制如何获取锁和维护锁。getState原创 2020-07-05 09:03:26 · 194 阅读 · 0 评论 -
哲学家就餐问题解决、死锁的追踪
哲学家就餐问题及死锁的追踪会产生死锁的代码:public class Test_Pheat { public static void main(String[] args) { Chopsticks c1=new Chopsticks("c1"); Chopsticks c2=new Chopsticks("c2"); Chopsticks c3=new Chopsticks("c3"); Chopsticks c4=new原创 2020-07-04 15:39:34 · 296 阅读 · 0 评论 -
多线程饥饿现象,饥饿与死锁区别
定义让有限多的工作线程来轮流异步处理无限多的工作任务,也可以将其归类为分工模式,典型实现就是线程池,也体现经典设计模式中的享元模式。例如:饭店给每个客人来了,都配备一个新的服务员那么开销资源消耗太大。注意:不同的类型应该使用不同的线程池,这样能避免饥饿,提升效率。例如:饭店切菜就是切菜的员工,服务员就是服务员。饥饿现象...原创 2020-07-04 17:41:17 · 9463 阅读 · 6 评论 -
Java-JDK中实现的线程池的使用
ThreadPoolExecutor线程池的状态ThreadPoolExecutor使用int的高三位来表示线程池的状态,低29位表示线程的数量。这里有一个问题,为何不用两个数字,一个代表状态,一个代表线程数量?这是因为这里为了线程安全,我们只需要使用一次CAS原子操作,定义一个原子整数,就可以满足需求。构造方法...原创 2020-07-03 17:32:32 · 347 阅读 · 0 评论 -
Java自定义线程池
学习自定义线程池之前大家应该先学习设计模式-享元模式下面这张图就是自定义线程池原理:ThreadPool类就是我们的线程池;BlockQuene类是我们定义的阻塞队列,当线程池满了,我们把来的任务先放到阻塞队列中;main就是我们客户也就是生产者,那线程池就是消费者;ThreadPool类ThreadPool里面有内部类Worker,它是线程池中装任务的容器,当任务来了就放到这个里面。线程池当然还要维护线程池的最大任务个数,当线程池中有空的worker那么就从阻塞队列blockque原创 2020-06-29 20:48:54 · 2015 阅读 · 0 评论 -
多线程-虚假唤醒问题-Java
文章目录什么是虚假唤醒发生虚假唤醒条件解决方法什么是虚假唤醒请看下面这段代码:这段代码大多数情况下运行正常,但是某些情况下会出问题。public class MyStack { private List<String> list = new ArrayList<String>(); public synchronized void push(String value) { synchronized (原创 2020-06-28 10:04:32 · 294 阅读 · 0 评论 -
多线程访问临界区无锁实现
000原创 2020-04-27 15:53:56 · 362 阅读 · 0 评论 -
happens-before-Java并发编程线程间可见性/有序性规则总结
文章目录1:synchronized/ReentrantLockvolatilestartinterrupt下述列举的规则,总结了一个线程的写对其他线程的读是可见的情况!1:synchronized/ReentrantLockpublic class Test1 { static int x=0; public static void main(String[] args) t...原创 2020-04-01 23:04:10 · 150 阅读 · 0 评论 -
Java并发编程-volatile关键字使用及原理
文章目录volatile简介volatile简介volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且...原创 2020-04-01 22:31:17 · 249 阅读 · 0 评论 -
两阶段终止设计模式
为什么需要两阶段终止设计模式:在主线程里创建了临界区对象,主线程里创建了一个线程t1去访问临界区,而临界区里面有一个监控线程(在t1访问临界区调用创建监控线程的方法)当我们需要在另外一个线程里(我的代码里是主线程)想要结束监控线程,那么就调用结束方法去结束监控线程。至于如何结束临界区中的监控线程因为stop方法已经废弃,而interupt也不是终止线程,所以这时我们就需要两阶段终止设计模式,来终...原创 2020-03-31 00:45:36 · 279 阅读 · 0 评论 -
java的两种同步方式, Synchronized与ReentrantLock的区别
java在编写多线程程序时,为了保证线程安全,...转载 2020-03-30 23:33:06 · 166 阅读 · 0 评论 -
Java并发编程线程安全-可见性/原子性/有序性
可见性原子性volitail原创 2020-03-30 23:31:08 · 206 阅读 · 0 评论 -
多个线程以固定顺序运行-Java
文章目录两个线程wait()/notifyAll()实现await()/signalAll()实现多个线程wait()/notifyAll()实现await()/signalAll()实现当有多个线程需要start时,这时它们的运行顺序是不一定的,虽然如果你在主线程里假如是t1.start();t2.start();,可能大多数情况是t1先运行,但是也有可能是t2先运行。两个线程通过有一个布...原创 2020-03-27 00:02:58 · 432 阅读 · 0 评论 -
死锁
哲学家就餐问题概述死锁-哲学家就餐检测会产生死锁的代码:public class Test_Pheat { public static void main(String[] args) { Chopsticks c1=new Chopsticks("c1"); Chopsticks c2=new Chopsticks("c2"); ...原创 2020-03-26 16:12:16 · 324 阅读 · 0 评论 -
Java-ReentrantLock基本使用及底层原理
概述ReentrantLock相对于synchronized有一下特性:1:可中断2:可设置超时时间3:可设置为公平锁4:可设置多个条件变量与synchronized相同的是:都是支持可重入。可重入可重入是指一个线程在获得一把锁后,因为它是这把锁的拥有这,所以有权利再次获得这把锁。但是不可重入是指,线程获得锁后再次想获得锁但是被挡住了!示例:让主线程连续获得method1...原创 2020-07-16 16:06:54 · 893 阅读 · 0 评论 -
设计模式 保护性暂停/解耦等待/生产者消费者
设计模式-保护性暂停实现原理:因为线程各类数据都在栈中,而对象数据都在堆中所以可以实现两个线程在同一个对象代码块里面操作(临界区)。一个设置,一个拿取出。在setThread还未将数据写入时,getThread进行wait操作直到setThread进行notifuall操作时getThread才能拿到对象运行。class GuardedObject{ private Object ...原创 2020-03-25 00:09:59 · 919 阅读 · 0 评论 -
Java多线程中interrupt()、interrupted()和isInterrupted()方法使用及两阶段终止设计模式
方法概述这里我们先说interrupt方法应用场景:1:用来打断正在阻塞的线程:sleep/wait/join2:打断正常的线程interrupt()其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。)作用与正常线程会将中断标记设置为true,但是作用于阻塞线程会将中断标志刷新fal...原创 2020-03-13 21:59:37 · 1483 阅读 · 1 评论 -
synchronized关键字底层原理 Java
synchronized用法在我的另外一篇博客中有讲链接如下,这篇博客主要讲底层原理。synchronized用法预备知识理解Java对象头与Monitor在JVM中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。填充数据:由于虚拟机要求对象起始地址必须...原创 2020-03-08 00:13:53 · 173 阅读 · 0 评论 -
Java多线程必须掌握的十个问题
一、进程与线程?并行与并发?进程代表一个运行中的程序,是资源分配与调度的基本单位。进程有三大特性:1、独立性:独立的资源,私有的地址空间,进程间互不影响。2、动态性:进程具有生命周期。3、并发性:多进程可以在单核CPU上并发运行。线程代表进程中的一个顺序执行流,多线程就...转载 2020-03-07 01:16:49 · 141 阅读 · 0 评论 -
Java synchronized用法
synchronized 简介概念synchronized提供一种锁的机制,能够保证多个线程同步互斥访问临界区资源,从而防止数据不一致的情况它修饰的对象有以下几种:修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象...原创 2020-03-07 01:01:09 · 258 阅读 · 0 评论 -
实现多线程的几种方法-Java
文章目录实现 Runnable接口方式实现多线程继承Thead方法实现多线程匿名内部类通过Callable和FutureTask创建线程通过线程池创建线程实现 Runnable接口方式实现多线程自定义类实现Runnable接口,将自定义类的对象传入Thread构造函数的参数。Thread构造函数Thread(Runnable target, String name)分配一个新的 Thre...原创 2020-03-04 01:12:14 · 307 阅读 · 1 评论 -
多线程学习 java
Java多线程(一)前言自学Java也有几个月了,刚学也接触不到啥项目,每天敲代码输出实在是有点厌倦,偶然发现写博客也是种输出的好方式。第一次写博客,如果入得了各位看官们的眼,还请不吝点赞;如果有不足或谬误之处,希望各位看官们能够在评论区批评斧正。好了,废话不多说,接下来进入正文,免得各位看官们觉得笔者有拖笔之嫌。线程与进程概念在讲相关概念前,先引入并发和并行的概念。并发指多个事件在...原创 2020-02-20 00:38:30 · 119 阅读 · 0 评论 -
JVM-常量池
引子:常量池有分类,它处在一个什么位置我们进场说的JVM内存模型,里面线程共享的(方法区、堆),线程私有(程序计数器、栈)。这几部分JVM内存模型是一个总体,而它们下面还有一些区域划分,例如栈有虚拟机栈和本地方法栈。我们的这篇文章所说的常量池它属于方法区的一部分(但是有特殊情况,因为虚拟机由于厂商和版本的不同内存模型的划分也有些许的改变,例如String常量池在JDK7之前属于方法区,而在7之后放到了堆中)。我们常量池也有分类,例如Class常量池、String常量池、运行时常量池。具体常量池相关的知识.原创 2020-09-04 01:36:52 · 252 阅读 · 0 评论 -
JVM调优-StringTable结构以及基本调优
对StringTable串池不了解朋友可以看我的博客JDK1.8中StringTable的底层类似于HashTable,由数组和链表实现,数组又称为桶数组。比如有这样一段代码:public class Demo4 { public static void main(String[] args) { int i = 0; System.out.println(i); }}我们设置虚拟机参数“-Xmx10m -XX:+PrintStringTableSt原创 2020-08-24 03:44:46 · 481 阅读 · 0 评论 -
Java-直接内存DirectMemory
文章目录直接内存设计逻辑直接内存所处的地位我们是如何使用直接内存的(NIO中怎样使用直接内存)直接内存分配和回收直接内存设计逻辑在我看周志明的《深入理解 Java 虚拟机 第三版》2.2.7 小节,里面关于 Java 直接内存的描述如下。直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。但是这部分内存也被频繁地使用,而且也可能导致 OutOfMemoryError 异常出现,所以我们放到这里一起讲解。在 JDK 1.4 中新加入了原创 2020-08-24 02:49:14 · 1754 阅读 · 1 评论 -
JVM方法区和常量池
最近一直被方法区里面存着什么东西困扰着? 1.方法区里存class文件信息和class文件常量池是个什么关系。 2.class文件常量池和运行时常量池是什么关系。 &nb...转载 2020-08-18 00:47:04 · 548 阅读 · 1 评论 -
JVM类生命周期概述:加载时机与加载过程
摘要: 我们知道,一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述了类的各种信息,并且它们最终都需要被加载到虚拟机中才能被运行和使用。事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行...转载 2020-08-17 22:16:00 · 201 阅读 · 0 评论 -
Java中对象的生存周期
文章目录JAVA对象的生存周期1.创建阶段(Created)为对象分配内存需要考虑的问题2.应用阶段(In Use)3.不可见阶段(Invisible)4.不可达阶段(Unreachable)5.收集阶段(Collected)6.终结阶段7.对象空间重新分配阶段JAVA对象的生存周期在Java中,对象的生命周期包括以下几个阶段: 创建阶段(Created) 应用阶段(In Use) 不可见阶段(Invisible) 不可达阶段(Unreachable) 收集阶段(C原创 2020-08-17 23:30:11 · 760 阅读 · 0 评论 -
JVM内存区域划分
Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: &nbs...转载 2020-08-17 17:02:33 · 204 阅读 · 0 评论 -
通过操作系统来了解JVM(企图找到操作系统和JVM间千丝万缕的关系)
进程和线程的区别对于进程来说,子进程是父进程的复制品,从父进程那里获得父进程的数据空间,堆和栈的复制品。这是对于一般操作系统概念对于JVM会有不同的理解大家可以看一下而线程,相对于进程而言,是一个更加接近于执行体的概念,可以和同进程的其他线程之间直接共享数据,而且拥有自己的栈空间,拥有独立序列。共同点: 它们都能提高程序的并发度,提高程序运行效率和响应时间。线程和进程在使用上各有优缺点。 线程执行开销比较小,但不利于资源的管理和保护,而进程相反。同时,线程适合在SMP机器上运行,而进程可以跨机器迁移原创 2020-08-13 13:07:15 · 869 阅读 · 0 评论 -
JVM垃圾回收算法与垃圾回收器
垃圾回收算法(三种)我们知道,怎样判断一个对象是否是垃圾,主要是看它是否GC Root 对象所引用。大家可以看一下Java中的四种引用如果未被GC Root对象所引用,那么看它是哪种引用,判断是否需要垃圾回收。我们看到上图中被GC Root实线连接都是不用被垃圾回收的。而未被GC Root直接连接的就是需要可能被垃圾回收。这时怎样去垃圾回收需要一种方法,这就需要垃圾回收算法。标记清除我们看到上图中被GC Root实线连接都是不用被垃圾回收的。而未被GC Root直接连接的就是需要可能被垃圾回收。原创 2020-07-24 01:30:37 · 354 阅读 · 0 评论 -
Java中的四种引用
文章目录强引用软引用、弱引用虚引用下图实线为强引用,虚线为软、弱、虚、终接器引用。强引用强引用就是沿着GC root对象能够直接找到那么,强引用不能被垃圾回收。除非和GC root的连接断开才可被垃圾回收。软引用、弱引用软引用:被软引用间接引用的A2对象,GC垃圾回收期第一次扫描不会垃圾回收,只有当扫描后发现内存不够时才会垃圾回收。弱引用:弱引用相对于软引用,没有被GC root直接引用,所以A3对象,只要发生垃圾回收,不管是否内存不够,都会被垃圾回收。当软引用和弱引用引用的对原创 2020-07-23 22:57:18 · 675 阅读 · 0 评论 -
JVM程序计数器
下图表示程序计数器在我们JVM中所处的地位原创 2020-07-20 20:32:50 · 513 阅读 · 1 评论 -
JVM-对象的创建过程/对象内存布局
对象的创建在代码层面我们看到对象的创建就是一个new但是这里我们在虚拟机的角度看对象创建的过程。1:在虚拟机遇到一条new指令时,首先检查这个指令的参数能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已经被加载,解析和初始化过。如果没有那必须先执行相应的类加载过程。2:类加载检查通过后,虚拟机为新生对象分配内存。...原创 2020-04-05 23:08:40 · 112 阅读 · 0 评论 -
接口 java
概述接口可以理解为一个特殊的类,里面全部是由全局变量和公共的抽象方法组成,没有构造方法。接口可以多实现,所以在某些方面弥补了java单继承的不足。使用与注意1):由于接口里面存在抽象方法,所以接口对象不能直接使用关键字new进行实例化, 接口的实现必须通过子类。(和前面所讲抽象类一样接口只可通过指向子类引用向上转型实例化,实现多态)。2):接口的子类(如果不是抽象类...原创 2019-03-03 21:29:30 · 175 阅读 · 0 评论 -
Java重载和重写
重载和重写是什么重载(overload):重载是让类以统一的方式处理不同类型的手段。 体现为多个具有不同类型的参数或者参数个数的同名函数(返回值可以随意,不可以以返回值作为重载标准),同时存在与同一个类中,是一个类多态性的表现。调用方法时通过判断不同的参数个数和参数类型来决定调用那个函数。重写(override)是父类与子类的多态的体现,是对父类函数的重新定义。如果在子类中定义方法有何父...原创 2019-07-02 17:25:50 · 134 阅读 · 0 评论 -
java 数组拷贝五种方式
概述此篇文章将阐述数组的五种拷贝方式,并展示源码。说明五种拷贝方式效率。简单叙述深/浅拷贝区别。如发现错误欢迎指正,谢谢。五种数组拷贝方式有1:clone2:System.arraycopy3:Arrays.copyOf4:Arrays.copyOfRange5:for循环拷贝效率:System.arraycopy > clone > Arrays.copyOf &g...原创 2019-04-05 13:27:21 · 410 阅读 · 0 评论