![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发
文章平均质量分 88
三角形代表重生
无聊就学习
展开
-
并发List:CopyOnWriteArrayList
JUC包中的并发List只有CopyOnWriteArrayList。CopyOnWriteArrayList是一个线程安全的ArrayList,使用了写时复制策略,对其进行的修改操作都是在底层的一个复制的数组上进行的。CopyOnWriteList 实现的接口和 ArrayList 完全相同,所以 ArrayList 提供的 api ,CopyOnWriteArrayList 也提供。原创 2023-06-30 15:52:08 · 1142 阅读 · 0 评论 -
线程同步器:CountDownLatch、CyclicBarrier、Semaphore
日常开发中经常遇到一个线程需要的场景,在CountDownLatch出现之前通常使用join方法来实现,但join方法不够灵活,所以开发了CountDownLatch。CountDownLatch比join方法来实现线程同步更加灵活。CountDownLatch是使用AQS实现的,使用AQS的状态变量存放计数器的值。原创 2023-06-30 14:54:41 · 705 阅读 · 0 评论 -
4.原子操作类:AtomicLong、LongAdderLong、Accumulator
JUC包中有AtomicInteger、AtomicLong和AtomicBoolean等原子性操作类,它们原理类似,下面以AtomicLong为例进行讲解。递增和递减操作代码上述代码中,valueOffset为AtomicLong在static语句块中进行初始化时通过。可以看到,上述四个方法都是(原子性操作)实现的。AtomicLong使用示例AtomicLong使用CAS非阻塞算法,性能比使用synchronized等的阻塞算法实现同步好很多。但在高并发下,大量线程会同时去竞争更新同一个原原创 2023-06-30 14:44:45 · 418 阅读 · 0 评论 -
2.CAS
使用锁不好的地方,当一个线程没有获取到锁时会被阻塞挂起,导致线程上下文切换和重新调度开销。Java提供了非阻塞的volatile关键字来解决共享变量的可见性问题,但是volatile不能解决读-改-写等原子性操作。CAS即Compare And Swap,JDK提供的非阻塞原子性操作,通过硬件保证了比较-更新操作的原子性,JDK中Unsafe类提供了一系列的compareAndSwap*方法。原创 2023-06-30 14:37:13 · 200 阅读 · 0 评论 -
2.ThreadLocalRandom
一般情况下,我们都会使用java.util.Random来生成随机数(Math.random()也是使用Random实例生成随机数)。原创 2023-06-30 14:16:31 · 227 阅读 · 0 评论 -
Java并发线程池
线程池一、为什么要用线程池?使用线程池的好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。比较重要的几个类:类名描述ExecutorService真正的线程池接口。ScheduledExecutorService能和Timer/Tim原创 2022-03-24 14:12:37 · 2074 阅读 · 0 评论 -
线程创建方式的三种方式
三种线程创建方式继承Thread类重写run方法:需要调用start方法就绪实现Runnable接口的run方法使用Callable和Future创建线程继承Thread类重写run方法过程:创建实例,此时该线程未被启动执行。调用该实例的start方法启动线程,达到就绪状态(已经获取了除CPU资源的其他资源),等待获取CPU资源才会处于运行状态。run方法执行完毕,线程处于终止状态。优势,劣势:线程创建方式过程优势劣势继承Thread类重写run方法1)原创 2022-03-02 12:12:01 · 1110 阅读 · 0 评论