
java
老罗爱java
热爱技术,热爱生活,热爱运动。
展开
-
通过Callable接口实现多线程
通过Callable接口实现多线程import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;class MyThread implements Callable<Integer> { @Override public Integer call() throws Exception { System.out.println(Thread.currentThread原创 2021-02-09 16:31:39 · 165 阅读 · 0 评论 -
java死锁编码及定位分析
java死锁编码及定位分析什么是死锁死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去。如果系统资源充足,线程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。自己写一个死锁import java.util.concurrent.TimeUnit;class DeadLockThread implements Runnable { private String lockA; pr原创 2021-02-09 10:52:29 · 131 阅读 · 0 评论 -
java线程池详解
java线程池详解七大参数四种拒绝策略类型描述AbortPolicy直接抛出RejectedException异常阻止系统正常运行CallerRunsPolicy”调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。DiscardOldestPolicy抛弃队列中等待最久对的任务,然后把当前任务加入队列中尝试再次提交当前任务。DiscardPolicy直接丢弃任务,不予任何处理也不抛出异常,如原创 2021-02-08 16:58:45 · 137 阅读 · 1 评论 -
手写生产者消费者模式
手写生产者消费者模式简述利用volatile+CAS+BlockingQueue,写一个简单版生产者消费者Demo。参考尚硅谷阳哥的视频,感谢大佬!实践package com.lly.test;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;import java.util.concur原创 2021-02-05 17:32:20 · 188 阅读 · 0 评论 -
BlockingQueue之常用类型Demo
BlockingQueue之常用类型Demo七大类型的Demo用法是我自己在学习的时候写的笔记,仅供参考。代码如下:package com.lly.test;import org.junit.jupiter.api.Test;import java.util.concurrent.*;public class BlockingQueueDemo { @Test public void test_ArrayBlockingQueue() { // 由数组结构原创 2021-02-05 16:53:25 · 306 阅读 · 1 评论 -
BlockingQueue学习
BlockingQueue学习什么是阻塞队列?线程1往阻塞队列中添加元素,而线程2从阻塞队列中移除元素。当阻塞队列是空时,从队列中获取元素的操作将会被阻塞。当阻塞队列是满时,往队列里添加元素的操作将会被阻塞。为什么用?有什么好处?在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动唤醒。为什么需要BlockingQueue好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都给你一手包办了。在conc原创 2021-02-04 08:57:20 · 2237 阅读 · 6 评论 -
Semaphore学习
Semaphore学习理论信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。实践举例:抢车位,6辆车抢3个车位import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;public class SemaphoreDemo { public static void main(String[] args) { // 模拟3个停车位原创 2021-02-02 14:00:27 · 177 阅读 · 1 评论 -
ReentrantLock之Condition用法
ReentrantLock之Condition用法题目题目:多线程之前按顺序调用,实现A->B->C三个线程启动,要求如下:A打印5次,B打印10次,C打印15次紧接着A打印5次,B打印10次,C打印15次…来5轮Demopackage com.lly.test;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/** * 线程操作资原创 2021-02-02 09:18:38 · 5924 阅读 · 7 评论 -
CyclicBarrier学习
CyclicBarrier学习理论CyclicBarrier的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法。实践举例:集齐7颗龙珠才能召唤神龙public class CyclicBarrierDemo { public static void main(String原创 2021-02-01 16:34:36 · 129 阅读 · 1 评论 -
CountDownLatch学习
CountDownLatch学习理论CountDownLatch主要有2个方法,当一个或多个线程调用await方法时,调用线程会被阻塞。其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),当计数器的值变为0时,因调用await方法被阻塞的线程会被唤醒,继续执行。实践以生活中的case,进行举例。5个同学上完晚自习,班长最后锁门。代码如下:public class CountDownLatchDemo { public static void原创 2021-02-01 09:52:34 · 165 阅读 · 0 评论 -
ArrayList线程安全问题解决
ArrayList线程安全问题解决问题现象多个线程操作同一个list会出现并发修改异常(java.util.ConcurrentModificationException)测试代码如下:public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i = 0; i < 30; i++) { new Thread(() -&g原创 2021-01-29 10:23:08 · 457 阅读 · 7 评论 -
CAS算法学习
CAS算法学习概念CAS就是compareAndSwap的缩写,一句话描述:比较并交换。是一个轻量级的同步机制.CAS算法涉及到3个操作数:需要读写的内存值V进行比较的值A需要更新的值B怎么使用以AtomicInteger类进行说明public class CASDemo { public static void main(String[] args) { // 初始值为1 AtomicInteger atomicInteger = new A原创 2021-01-28 09:04:08 · 293 阅读 · 0 评论 -
LRU算法学习
LRU算法学习概念LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。Demo示例参考了尚硅谷阳哥的视频、力扣算法LRU 缓存package com.lly.lru;import java.util.HashMap;import java.util.Map;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.Reent原创 2021-01-25 17:03:01 · 150 阅读 · 0 评论 -
java重入锁学习
java重入锁学习什么是重入锁同一个线程能够多次获得同一把锁,不需要等待锁的释放。(比如自己花自己的钱,不用给自己写借条一样的道理)通过synchronized关键字实现public class LockDemo1 { static Object objectLock = new Object(); public static void main(String[] args) { new Thread(() -> { sync原创 2021-01-07 10:10:39 · 154 阅读 · 0 评论 -
serialVersionUID详解
serialVersionUID详解序列化是将对象的状态信息转换为可存储或传输的形式的过程。我们都知道, Java对象是保存在JVM的堆内存中的, 也就是说, 如果JVM堆不存在了, 那么对象也就跟着消失了。⽽序列化提供了⼀种⽅案, 可以让你在即使JVM停机的情况下也能把对象保存下来的⽅案。 就像我们平时⽤的U盘⼀样。把Java对象序列化成可存储或传输的形式( 如⼆进制流) , ⽐如保存在⽂件中。 这样, 当再次需要这个对象的时候,从⽂件中读取出⼆进制流, 再从⼆进制流中反序列化出对象。 但是, 虚原创 2020-11-06 08:53:15 · 698 阅读 · 0 评论