![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 83
IT_小白鼠
good good study!
day day up!
展开
-
Java并发编程之synchronized关键字解析
前言公司加班太狠了,都没啥时间充电,这周终于结束了。这次整理了Java并发编程里面的synchronized关键字,又称为隐式锁,与JUC包中的Lock显示锁相对应;这个关键字从Java诞生开始就有,称之为重量级锁,自从JDK1.6之后官方对该关键字进行优化,引入了轻量级锁和偏向锁,于是就有了锁升级的概念。使用在代码中使用这个关键字总共有以下三种: private static Object object = new Object(); private syn...原创 2022-03-13 17:37:54 · 559 阅读 · 0 评论 -
ThreadLocal原理解析以及是否需要调用remove方法
平常的开发过程中,如果有个类不是线程安全的,比如SimpleDateFormat,要使这个类在并发的过程中是线程安全的,那么可以将变量设置位局部变量,不过存在的问题就是频繁的创建对象,对性能和资源会有一定降低和消耗;那么这里就可以用到ThreadLocal作为线程隔离,那么ThreadLocal是如何实现线程与线程之间隔离的呢,待会儿会在下文进行讲解。之前有篇使用ThreadLocal做线程之间的隔离实例,大家可以参考一下:使用ThreadLocal实现Mybatis多数据源在了解ThreadLoc原创 2021-08-27 11:16:42 · 2458 阅读 · 0 评论 -
基于Zookeeper使用ZkClient实现分布式锁
有段时间没写博客了,在整理之前写过的一套自定义框架,并且整理好上传值github上了,也有一些新功能还在开发,欢迎大家使用:一个好用的Http接口请求工具组件可能今天这篇文章跟之前的比有些跳跃性,一下子就谈到了Zookeeper了,不过也没关系啦,先谈谈最常用,然后在慢慢看Zooeeper的其他知识。简单介绍ZooKeeper致力于提供一个高性能、高可用,且具备严格的顺序访问控制能力的分布式协调服务,是雅虎公司创建,是Google的Chubby一个开源的实现,也是Hadoop和Hbase的重要组原创 2021-07-20 00:22:10 · 562 阅读 · 5 评论 -
Java并发编程之线程定时器ScheduledThreadPoolExecutor解析
定时器就是需要周期性的执行任务,也叫调度任务,在JDK中有个类Timer是支持周期性执行,但是这个类不建议使用了。ScheduledThreadPoolExecutor继承自ThreadPoolExecutor线程池,在Executors默认创建了两种:newSingleThreadScheduledExecutor:只包含一个线程,只需要单个线程执行周期任务,保证顺序的执行各个任务。newScheduledThreadPool: 可以包含多个线程的,线程执行周期任务,适度控制后台线程数原创 2021-05-01 14:07:33 · 2981 阅读 · 0 评论 -
Java并发编程之线程池ThreadPoolExecutor解析
线程池存在的意义平常使用线程即new Thread()然后调用start()方法去启动这个线程,但是在频繁的业务情况下如果在生产环境大量的创建Thread对象是则会浪费资源,不仅增加GC回收压力,并且还浪费了时间,创建线程是需要花时间的;线程池的存在就是降低频繁的创建线程,降低资源的消耗以及创建时间的浪费,并且可以同一管理。ThreadPoolExecutor在JDK中所有的线程池的父类就是ThreadPoolExecutor,以下是它的构造方法 /** * Creat原创 2021-05-01 10:58:29 · 220 阅读 · 0 评论 -
Java并发编程之堵塞队列介绍以及SkipList(跳表)
堵塞队列先了解一下生产者消费者模式:生产者就是生产数据的一方,消费者就是消费数据的另一方。在多线程开发中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这种生产消费能力不均衡的问题,便有了生产者和消费者模式。生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题,即有了MQ(Message Queue)中间件。生产者和消费者彼此之间不直接通信,而是通过阻塞队列来进行通原创 2021-04-30 22:23:41 · 364 阅读 · 1 评论 -
Java并发编程之并发容器ConcurrentHashMap(JDK1.8)解析
这个版本ConcurrentHashMap难度提升了很多,就简单的谈一下常用的方法就好了主要数据结构1.8将Segment取消了,保留了table数组的形式,但是不在以HashEntry纯链表的形式储存数据了,采用了链表+红黑树的形式储存数据;在使用get()方法时,使用纯链表的时间复杂度时O(n),而在使用红黑树的数据结构时,时间复杂度为O(logn),在查询的速度上有很大的提升;但是在创建的时候并非直接使用红黑树储存数据,而是依旧采用链表存储,但是但链表的长度超过8的时候就会转换成红黑树数据结构原创 2021-04-27 14:29:05 · 274 阅读 · 0 评论 -
Java并发编程之并发容器ConcurrentHashMap(JDK1.7)解析
最近看了一下ConcurrentHashMap的相关代码,感觉JDK1.7和JDK1.8差别挺大的,这次先看下JDK1.7是怎么实现的吧哈希(hash)先了解一下啥是哈希(网上有很多介绍),是一种散列函数,简单来说就是将输入值转换为固定值的一种压缩映射,在Java中最常见的就是Object.hashCode(),通过固定算法计算出来的一个值...原创 2021-04-18 21:55:57 · 172 阅读 · 0 评论 -
Java并发编程之FutureTask源码解析
上次总结一下AQS的一些相关知识,这次总结了一下FutureTask的东西,相对于AQS来说简单好多呀之前提到过一个LockSupport的工具类,也了解一下这个工具类的用法,这里也巩固一下吧 /** * Makes available the permit for the given thread, if it * was not already available. If the thread was blocked on * {@code park} t原创 2021-04-09 13:32:04 · 177 阅读 · 0 评论 -
Java并发编程之AbstractQueuedSynchronizer(AQS)源码解析
自己一个人随便看看源码学习的心得,分享一下啦,不过我觉得还是建议去买本Java并发编程的书来看会比较好点,毕竟个人的理解有限嘛,好啦进入整体啦。独占锁和共享锁首先先引入这两个锁的概念:独占锁即同一时刻只有一个线程才能获取到锁,Lock的实现类中ReentrantLock和WriteLock就是独占锁,所以独占锁也叫排它锁;共享锁是同一时刻多线程能获取到的锁叫共享锁,即ReadLock;在读写锁共有的情况下,会出现共存的情况即读-读共存,读-写、写-写不能共存,他们会产生互斥。数据结构.原创 2021-04-08 16:34:14 · 257 阅读 · 7 评论 -
Java并发编程之显式锁(Lock)使用
又是一个基于AQS好用的类,看来下次有必要看看AQS了,正好又是放假。既然叫显式锁,必然也有隐式锁,也就是所谓的synchronzied关键字,它们两者的区别呢在于使用范围,synchronzied关键字的使用范围比Lock要小,在Lock的实现类中与synchronzied相近似的类叫ReentrantLock,也叫可重入锁,待会儿在说看看Lock吧Lock是一个接口,主要的实现类有三个 ReadLock(写锁),WriteLock(读锁),ReentrantLock(可重入锁)核心方法:原创 2021-04-04 11:33:44 · 427 阅读 · 0 评论 -
Java线程CAS原子操作
这次分享一些关于CAS东西!!!定义CAS(Compare And Swap)是CPU的一个指令级别的操作,叫原子操作,原子操作是不可分割的,跟事务差不多,要么全部执行完成,要么不执行;像这种操作有点类似阻塞锁机制,但是使用阻塞锁机制去控制的话,会比较消耗性能,而使用CAS操作的话会比使用锁更快。与synchronized性能比较,最简单的一个测试Demopublic class AtomicNumber { AtomicInteger ai = new AtomicIntege原创 2021-04-03 20:50:05 · 114 阅读 · 0 评论 -
Java线程并发常用工具类使用
这次整理了一些比较常用的线程工具类啦。CountDownLatch:在一组线程执行完后,才能开始执行调用等待的线程。上片文章提到过junit的测试尽量不要测试线程,如果硬是要可以使用CountDownLatch进行测试CyclicBarrier:在一组线程中调用等待方法后,只有这组所有线程都进入等待后,会执行一个指定的线程,在指定的线程执行完后,这组等待的线程才能继续执行。Semaphore:可用于限流使用。Exchanger:当两组线程都执行到交换的方法时,能将数据在这两个线程之间进行数据原创 2021-04-02 20:19:26 · 229 阅读 · 0 评论 -
Java线程的使用及共享协作
创建线程的三种方式1、继承Thread;static class MyThread extends Thread{ @Override public void run() { //do something... }}public static void main(String[] args) throws InterruptedException { MyThread thread = new MyThread (); thread.start();}原创 2021-03-26 14:27:15 · 102 阅读 · 0 评论 -
Java线程Fork/Join思想及实现
最近在看线程这一块的东西,所以之前的那篇文章就是用来记录的,但看起来好简单的样子,哈哈哈!这两天看的是Fork/Join分而治之的思想,Doug Lea大师的JUC还是挺强的,学并发编程应该没有人不知道这个大佬吧!上篇少记录了一个东西,叫守护线程,即Thread.setDaemon(boolean on);当参数为false的时候,没有意思,当参数为true的时候,即调用该方法的线程与当前的线程共生死,就是当前线程结束了后无论调用setDeamon(true)的线程是否结束,它都会结束;这个这么看.原创 2021-04-02 14:03:57 · 246 阅读 · 0 评论