Java并发编程
文章平均质量分 78
学习探究Java并发编程。包含concurrent包
kaikai_sk
我的个人主页:https://kaikai-sk.github.io/
爱生活/爱技术
Public:
(1) https://past.date-conference.com/proceedings-archive/2022/html/0878.html
【证书】
软件设计师(软考中级)
展开
-
Java并发编程实战——结构化并发应用程序2
在Java的API或语言规范中,并没有将中断和任何取消语义关联起来,但实际上,如果在取消之外的其他操作中使用中断都是不合适的,并且很难支撑起更大的应用。线程的所有权是不可以传递的:应用程序可以拥有服务,服务也可以拥有工作者线程,但是应用程序并不能拥有工作者线程,因此应用程序不能直接停止工作者线程。对于持有线程的服务,只要服务的存在时间大于创建线程的方法的存在时间,那么就应该提供生命周期方法。由于每个线程拥有各自的中断策略,因此除非你知道中断对该线程的含义,否则就不应该中断这个线程。原创 2023-08-16 16:09:50 · 230 阅读 · 0 评论 -
Java并发编程实战——结构化并发应用程序
(2)Timer执行所有的定时任务时只会创建一个线程。如果有足够多的线程使所有的CPU保持忙碌状态,那么再创建更多的线程反而会降低性能。在一定范围内,增加线程可以提高系统的吞吐率,但是如果超出了这个范围,再创建更多的线程会降低程序的执行速度。Executor基于生产者-消费者模式,提交任务的操作相当于生产者(生成待完成的工作单元),执行任务的线程相当于消费者(执行完这些工作单元)。只有大量相互独立且同构的任务可以并发进行处理时,才能体现出将程序的工作负载分配到多个任务中带来的真正性能提升。原创 2023-08-09 17:51:35 · 660 阅读 · 0 评论 -
Java并发编程实战——基础知识3
例如Vector和HashTable。原创 2023-08-04 11:15:16 · 118 阅读 · 0 评论 -
Java并发编程实战——基础知识2
ListHelper只是带来了同步的假象,尽管所有的链表操作都被声明为了synchronized,但是使用了不同的锁,这意味着putIfAbsent相对于List的其他操作来说并不是原子的,因此无法确保putIfAbsent执行时另一个线程不会修改链表。使用私有的锁对象而不是对象的内置锁,有诸多优点:(1)私有的锁对象可以将锁封装起来,使客户代码无法得到锁,但客户代码可以通过公有方法来访问锁,以便参与到它的同步策略中。当一个对象被封装到另一个对象中时,能够访问被封装的对象的所有代码路径都是已知的。原创 2023-08-01 14:48:53 · 305 阅读 · 0 评论 -
Java并发编程实战——基础知识
当读取一个非volatie类型的long变量的时候,如果对该变量的读写在不同的线程中,那么很可能会读取到某个值的高32位和另一个值的低32位。volatile变量的正确使用方式包括: 确保它们自身状态的可见性,确保它们所引用对象的状态的可见性,以及标识一些重要的程序生命周期事件的发生(例如,初始化或者关闭)。死锁、饥饿和活锁等问题都是活跃性问题。正如“除非需要更高的可见性,否则应将所有的域都声明为私有域”是一个良好的编程习惯,“除非需要某个域是可变的,否则应将其声明为final域”也是一个良好的编程习惯。原创 2023-08-01 09:16:54 · 253 阅读 · 0 评论 -
Java对象内存布局和对象头
【对象标记】Mark Word【类元信息】又名类型指针。原创 2023-07-08 19:01:40 · 254 阅读 · 0 评论 -
JUC之ThreadLocal
ThreadLocal实现线程隔离不在于它自己本身,而在于ThreadLocalMap,所以ThreadLocal可以只初始化一次,只分配一次存储空间就可以了。无需作为成员变量多次被初始化。建议把ThreadLocal修饰为static。使用完之后需要显示调用remove。【声明为static】原创 2023-07-08 12:57:19 · 221 阅读 · 0 评论 -
JUC之CAS和原子操作类
通过一个demo来了解AtomicInteger的使用。以一种线程安全的方式操作非线程安全对象内的某些字段。版本号和戳记流水机制。原创 2023-06-28 20:23:31 · 271 阅读 · 0 评论 -
JUC之LockSupport和中断
wait和notify必须在同步代码块中,否则会抛出。原创 2023-06-26 20:46:10 · 310 阅读 · 0 评论 -
JUC之CompletableFuture
就是抛出的异常不一样。join不需要使用方显示地捕获异常。带Async后缀和不带后缀的api的区别。(2) 多个任务前后依赖可以组合处理。结合线程池,可以提升程序的运算效率。(3)选择计算速度最快的那个线程。(1) 缺少完成时的回调通知。(2)isDone通常会轮询。(1) get方法阻塞。原创 2023-06-19 23:56:10 · 237 阅读 · 0 评论 -
并发编程现场编程题
【代码】ABC三个线程分别打印ABC,现实现能够循环N次打印ABC。原创 2023-05-31 21:18:21 · 85 阅读 · 0 评论 -
Java“锁“事
SpinLock.javapackage com.sk.spinlock;import java.util.concurrent.atomic.AtomicReference;public class SpinLock{ //Java中的原子操作(CAS) //持有自旋锁的线程对象 AtomicReference owner=new AtomicReferen原创 2018-02-02 14:28:08 · 1741 阅读 · 4 评论 -
JUC之ReetrantLock
lock()//获取锁,一直等待锁可用 public void lock() { sync.lock(); } //公平锁获取 final void lock() { acquire(1); } //非公平锁的获取 final void lock() { if (compareAndSetState(0...原创 2019-03-20 22:24:49 · 163 阅读 · 0 评论 -
JUC之CountDownLatch
CountDownLatch是一个同步辅助类,通过AQS实现的一个闭锁。在其他线程完成它们的操作之前,允许一个多个线程等待。简单来说,CountDownLatch中有一个锁计数,在计数到达0之前,线程会一直等待。从锁类别来说,CountDownLatch是一个“共享锁”,内部定义了自己的同步器Sync,Sync继承自AQS,实现了tryAcquireShared和tryReleaseShar...原创 2019-03-21 17:28:34 · 100 阅读 · 0 评论 -
JUC之线程基础
package com.sk.thread;/** * 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 * @author root */public class TraditionalThreadCommunication{ public static void main(String[] args原创 2017-08-29 10:00:00 · 439 阅读 · 0 评论 -
JUC之Lock接口和Condition接口
package com.sk.lock;public interface Lock{ /** * 获取锁,如果锁不可用则线程一直等待 * 获取失败后,线程进入等待队列自旋或休眠,直到锁可用,并且忽略中断的影响 */ void lock(); /** * 获取锁,响应中断,如果锁不可用则线程一直等待; * 线程进入等待...原创 2019-03-20 19:35:59 · 247 阅读 · 0 评论 -
JUC之ReentrantReadWriteLock
ReentrantReadWriteLock维护了一对相关的锁:共享锁readLock和独占锁writeLock。共享锁readLock用于读操作,能同时被多个线程获取;独占锁writeLock用于写入操作,只能被一个线程持有。ReentrantReadWriteLock具有以下几种特性:公平性- 非公平模式默认模式。一个持续争用的非公平锁,可能会使其他读线程或写线程无限延期,但它比公平...原创 2019-03-20 23:11:18 · 122 阅读 · 0 评论 -
JUC之AQS
Condition接口的实现await() /** * 使当前线程在被唤醒或者中断之前一直处于等待状态 **/ public final void await() throws InterruptedException { if (Thread.interrupted()) throw new InterruptedExce...原创 2019-03-20 22:23:05 · 325 阅读 · 0 评论 -
JUC之ConcurrentHashMap
ConcurrentHashMap 在JDK 7之前是通过Lock和Segment(分段锁)实现并发安全,JDK 8之后改为CAS+synchronized来保证并发安全(为了序列化兼容,JDK 8的代码中还是保留了Segment的部分代码)。1. ConcurrentHashMap、HashMap和HashTable的区别HashMap 是非线程安全的哈希表,常用于单线程程序中。Hash...原创 2019-03-24 21:40:53 · 184 阅读 · 0 评论 -
JUC之CyclicBarrier
1. 概述CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。如果一个程序中有固定的线程数,并且线程之间需要相互等待,这时候CyclicBarrier是一个很好的选择。之所以叫它cyclic,是因为在释放等待线程之后,它可以被重用。CountDownLatch和CyclicBarrier的区别Coun...原创 2019-03-24 23:12:02 · 116 阅读 · 0 评论 -
JUC之JMM和volatile
package com.sk.thread;import java.util.HashMap;import java.util.Map;import java.util.Random;public class ThreadScopeShareData { private static int data = 0; private static Map原创 2017-08-29 10:34:42 · 483 阅读 · 0 评论 -
JUC之Phaser
1. 整体public class Phaser{ //------------------------------核心参数-------------------------------------- /** * 标识内部状态 * 低0-15位表示为到达parties数 * 中16-31位表示等待的parties数 * 中32-62表示p...原创 2019-03-26 22:33:19 · 494 阅读 · 0 评论