java
文章平均质量分 64
书生灬今天不吃饭
这个作者很懒,什么都没留下…
展开
-
aspose-cell将excel转pdf时,对pdf设置权限限制
aspose-cell将excel转pdf时,对pdf设置权限限制直接看代码:public static void excelToPdf(InputStream fileInput, OutputStream fileOutput) { // 验证License if (!getLicense()) { return; } String property = System.getProperty("user.dir"原创 2021-11-03 14:26:28 · 1426 阅读 · 0 评论 -
SpringCloud微服务搭建(Hoxton.SR8)(一)-- Eurka的注册与发现
这里我们不再介绍SpringCloud的知识,直接搭建框架。这里我们选择将不同的模块创建在一个父项目下。一、创建父项目1、新建一个springboot项目2、pom文件内容(依赖) <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-原创 2021-02-08 17:24:01 · 555 阅读 · 0 评论 -
JUC并发编程(十四)-- 死锁
JUC并发编程(十四)-- 死锁一、死锁的实现二、处理死锁1、使用 jps -l 定位死锁的进程2、使用jstack 查看问题一、死锁的实现我们这里直接跳过什么是死锁的概念,直接用代码实现死锁:package com.zhan.juc.lock;import java.util.concurrent.TimeUnit;/** * 死锁demo * @Author Zhanzhan * @Date 2021/2/6 15:10 */public class DeadLockDemo {原创 2021-02-06 15:32:09 · 259 阅读 · 3 评论 -
JUC并发编程(十三)-- 自旋锁
JUC并发编程(十三)-- 自旋锁一、什么是自旋锁二、自旋锁的实现一、什么是自旋锁自旋锁:即当一个目标线程上锁后,其他线程就会循环等待,直到目标线程释放锁为止。二、自旋锁的实现这里我们在加锁时,使用了CAS来作为自旋的条件判断上代码:package com.zhan.juc.lock;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicReference;/** * 自旋锁demo原创 2021-02-06 14:58:41 · 251 阅读 · 2 评论 -
JUC并发编程(十二)--可重入锁
JUC并发编程(十二)--可重入锁一、什么是可重入锁二、不可重入锁三、可重入锁实现一、什么是可重入锁同一个线程可以多次上锁代码段。二、不可重入锁指的就是同一个线程不能多次上锁代码段。代码实例:package com.zhan.juc.lock;/** * 可重入锁demo * @Author Zhanzhan * @Date 2021/2/6 13:59 */public class ReentrantLockDemo { static MyLock myLock = n原创 2021-02-06 14:28:01 · 170 阅读 · 2 评论 -
JUC并发编程(十一)--深入理解CAS,以及ABA问题
JJUC并发编程(十一)--深入理解CAS,以及ABA问题一、CAS二、Unsafe类三、ABA问题四、原子引用一、CASCAS的操作过程:首先读取主内存位置M的原值到自己的工作内存,记为E,然后计算新值V,然后将主内存位置M的值与E比较(compare),如果相等,则在此过程中说明没有其它线程来修改过这个值,所以把内存位置M的值更新成V(swap)直接看代码演示:package com.zhan.juc.cas;import java.util.concurrent.atomic.Atomic原创 2021-02-05 22:54:36 · 303 阅读 · 2 评论 -
JUC并发编程(十)--Volatile、原子性以及单例模式的应用
JMM一、什么是JMMJMM是一种Java内存模型,是一种概念性的约定,而不是实际存在的东西。二、JMM的约定线程解锁前,必须把变量立即刷回主存;我们知道,一个线程工作时,会将主存中的变量复制一份给线程自己的内存,作为一个副本,线程对此变量的操作,都是在副本上的操作,所以当线程运行完毕,解锁的时候,必须将副本的值同步回主存。线程加锁前,必须读取主存中最新的变量值,然后复制到自己的工作内存中;加锁和解锁是同一把锁。三、八种操作从主存中read操作和load到线程工作内存中原创 2021-01-30 15:28:01 · 1515 阅读 · 5 评论 -
JUC并发编程(九)-- Fork/Join框架
JUC并发编程(九)-- Fork/Join框架一、什么是Fork/Join1、概述2、特点二、代码实现一、什么是Fork/Join1、概述fork/join 框架可以将一个大任务,拆分成一个个的小任务,然后分别计算,将得到的结果相加后,给出一个完整的结果。2、特点fork/join还有一个特点,叫:工作窃取。什么是工作窃取??有这样一个场景,有两个线程A和B,都分配了四个任务,A线程刚刚执行了一个任务,而B线程已经执行完了分配给它的四个任务,那么这个时候,通常情况下,B线程就会无事可做,而原创 2020-12-21 21:44:00 · 243 阅读 · 2 评论 -
JUC并发编程(八)-- 线程池
JUC并发编程(八)-- 线程池池化技术线程池的优点线程池的用法一、三大方法1、创建单个线程的线程池2、创建一个固定大小的线程池3、创建一个可伸缩的线程池二、七大参数三、四种拒绝策略1. AbortPolicy2. CallerRunsPolicy3. DiscardOldestPolicy4. DiscardPolicy池化技术我们知道,程序的运行,本质是占用系统的资源,那为了优化资源的时候,就出现了池化技术!常见的有:线程池、内存池、对象池 等待…一句话总结池化技术:事先准备好一些资源,有人需要原创 2020-12-05 18:01:09 · 627 阅读 · 1 评论 -
JUC并发编程(七)-- 阻塞队列BlockingQueue
JUC并发编程(七)-- 阻塞队列BlockingQueue什么是BlockingQueue什么场景下使用?BlockingQueue的核心APIBlockingQueue常用的实现类一、ArrayBlockingQueue二、LinkedBlockingQueue三、ArrayBlockingQueue和LinkedBlockingQueue区别什么是BlockingQueueBlockingQueues在java.util.concurrent包下,提供了线程安全的队列访问方式,当阻塞队列插入数据时原创 2020-12-04 22:45:55 · 225 阅读 · 0 评论 -
JUC并发编程(六)-- ReadWriteLock
什么是ReadWriteLock首先我们看jdk文档:我们可以看到,这个是读写锁,里面维护了一组锁(读锁和写锁),即读可以被多个线程同时读,而写只能有一个线程去写。这样既保证了性能,又保证了线程安全。怎么使用一般的ReentrantLock实现了标准的互斥锁,即当一个线程持有锁时,其他线程等待,直到当前持有锁的线程释放锁。这样虽然保证了多线程下数据的安全性,但会影响并发性能。拿两个线程来举个例子:一般我们我们用两个线程在加了ReentrantLock锁后操作数据会有哪些情况?读 <-&原创 2020-12-03 21:48:51 · 161 阅读 · 0 评论 -
JUC并发编程(五)-- 常用辅助类之CountDownLatch、CyclicBarrier、Semaphore
JUC并发编程(五)-- 常用辅助类之CountDownLatch、CyclicBarrier、SemaphoreCountDownLatch一、什么是CountDownLatch二、如何使用?CyclicBarrier一、什么是CyclicBarrier?二、怎么使用?Semaphore一、什么是Semaphore?二、怎么使用?CountDownLatch一、什么是CountDownLatch我们可以去jdk1.8中文帮助文档中查看:我们可以看到,原来CountDownLatch是一个计数器,原创 2020-12-02 21:59:27 · 195 阅读 · 0 评论 -
JUC并发编程(四)-- Callable
JUC并发编程(四)-- Callable什么是Callable和Runnable的不同怎么在Thread中使用Callable?什么是CallableCallable是java.util.concurrent包下面的一个接口,它和RunNable一样,可以实现Callable来创建线程。和Runnable的不同Callable有返回值;Callable可以抛出异常;方法不同,Runnable是run(),而Callable是call()。怎么在Thread中使用Callable?首先我原创 2020-12-01 21:59:29 · 198 阅读 · 1 评论 -
JUC并发编程(三)-- 集合线程安全
JUC并发编程(三)-- 集合线程安全List一、常用的Arraylist是否为线程安全二、解决方案1)使用 Collections 工具类来创建一个线程安全的 ArrayList2)使用 CopyOnWriteArrayListSet一、常用的HashSet是否为线程安全?二、解决方案1) 使用 Collections 创建2)使用 CopyOnWriteArraySet创建Map一、常用的HashMap是否为线程安全?二、解决方案1)使用 Collections 来创建同步的 HashMap2)使用 C原创 2020-11-29 17:05:47 · 726 阅读 · 3 评论 -
JUC并发编程(二)-- 线程八锁
JUC并发编程(二)-- 线程八锁1、两个线程,分别调用同一个资源类的两个方法,哪个先执行?2、两个线程A和B,分别调用同一个资源类的两个方法,A线程休眠3秒,哪个线程先执行?3、非同步方法是否会受到对象锁的影响?4、同一个类中两个对象的同步方法时候会相互影响?5、同一个类中的两个静态同步方法时候会互相影响?6、同一个类中,一个静态同步方法和一个普通同步方法,会相互影响吗?线程八锁,指的就是线程中关于锁的八个问题,用来分辨清晰Java多线程中,锁究竟锁的是什么。以下 5 和 6 两个问题分别是两个子问题原创 2020-11-28 22:17:28 · 228 阅读 · 0 评论 -
JUC并发编程学习(一)
线程wait和sleep区别1、来自不同的类wait 是 object类的sleep是 Thread类的2、关于锁的释放wait会释放锁,sleep不会释放锁。3、使用的范围不同wait 必须在同步代码块中使用sleep 可以在任何地方使用Lock锁synchronizedLockReentrantLockReentrantLock–>可重入锁,使用new创建的时候如下:默认无参构造为非公平锁,有参构造传true为公平锁。公平锁:线程获取锁的顺序和调用lock的顺原创 2020-11-28 15:15:19 · 319 阅读 · 0 评论 -
Elasticsearch入门(二)-- 基本的增删改查以及复杂查询语句
Elasticsearch入门(二),基本的增删改查操作增删改查基本操作创建一个索引创建索引,并设置字段类型获取指定索引的信息修改数据用put请求修改用post请求修改简单的条件查询删除删除索引删除文档复杂查询查询条件封装为对象只查指定的数据字段排序分页查询布尔查询must (类似mysql中的and)should (类似mysql中的 or)must_not (类似mysql中的 not )过滤器匹配多个条件使用倒排索引查询keyword类型高亮查询增删改查基本操作创建一个索引PUT /索引名/类型原创 2020-11-22 15:38:13 · 576 阅读 · 0 评论 -
深入理解JVM
深入理解JVMJVM内存结构jdk1.8内存区域划分各区域jvm中堆的内存模型深入GC垃圾回收算法如何确定对象不可用1、引用计数器算法2、可达性分析算法回收算法1、标记—清除算法2、复制算法3、标记—整理算法4、分代收集JVM内存结构jdk1.8内存区域划分各区域程序计数器每个线程一块,指向当前线程正在执行的字节码代码的行号,每条线程都有一个独立的程序计数器,程序计数器为“线程私有”的内存,线程间不共享。Java虚拟机栈同样是线程私有的,线程间不共享。每个方法在执行的时候也会创建一个栈帧原创 2020-08-10 15:54:41 · 229 阅读 · 0 评论 -
Java equals()和hashCode()的区别和使用
Java equals()和hashCode()的区别和使用目录Java equals()和hashCode()的区别和使用equals()和hashCode()的作用equals()和hashCode()的区别和使用equals()和hashCode()的区别equals()和hashCode()的使用代码实例得到的结论equals()和hashCode()的作用用来比较两个对象实例是否相同equals()和hashCode()的区别和使用equals()和hashCode()的区别**equ原创 2020-07-30 14:00:36 · 154 阅读 · 0 评论