![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程编程
孤竹彧
一个想进步,又控制不住自己的小码农
展开
-
AQS(AbstractQueuedSynchronizer)类核心思想
AQS原创 2023-02-20 19:50:21 · 62 阅读 · 0 评论 -
LockSupport类核心思想
LockSupport核心思想原创 2023-02-20 19:00:25 · 55 阅读 · 0 评论 -
unsafe类核心思想
unsafe类核销思想原创 2023-02-20 18:48:28 · 54 阅读 · 0 评论 -
线程学习笔记
线程状态原创 2023-02-18 17:27:30 · 50 阅读 · 0 评论 -
ThreadLocal内存泄漏问题分析
深入理解ThreadLocal内存泄漏原创 2023-02-17 00:08:01 · 237 阅读 · 0 评论 -
利用CompletableFuture实现请求合并操作
请求合并的思想:不是每次请求都建立连接,而是把多个请求进行合并,一起访问数据库,节约空间。所以必然时间会延长,所以请求合并是:时间换空间。其实其中的想法,都可以想到,唯一想不到的就是CompletableFuture的使用。原本的Order类public class Order { private String code; private String name; ...原创 2020-02-25 23:45:44 · 1527 阅读 · 2 评论 -
ThreadLocal的实际运用
之前在利用zookeeper实现分布式锁时候,使用了ConcurrentHashMap保存currentPath等,现在有了ThreadLocal,我们可以直接使用ThreadLocal了把MyZookeeperLock的类进行修改,其他代码不变,依然可以用public class MyZookeeperLock implements Lock { private String lo...原创 2020-02-24 17:37:39 · 401 阅读 · 0 评论 -
ThreadLocal中魔数0x61c88647如何得到
根据ThreadLocal源码分析(简单)这篇文章,我们得到:首先,这个魔数得是和Intger.MAX_VALUE互质,那样才能保证累加之后,不会出现遗漏现象。其次,尽量让没两个数之间距离较远,因为nextIndex的操作是累加,如果靠的太近,就会出现不断循环还是找不到空位的情况,简而言之就是要尽量散列首先,我们以长度8为例,这时候的魔数最好是几呢?2、4、6、8排除,与8互质1、7排除...原创 2020-02-24 17:21:54 · 875 阅读 · 0 评论 -
ThreadLocal源码分析(简单)
ThreadLocal的三个常用接口set(T value)、get()、remove();set:public void set(T value) { Thread t = Thread.currentThread(); //这个代码不用看,就是返回thread的一个属性threadLocals ThreadLocalMap map = getMap(t); if ...原创 2020-02-24 16:09:17 · 188 阅读 · 0 评论 -
线程池的学习之ThreadPoolExecutor的测试
各个字段的解释以及测试用例public class Test { public static void main(String[] args) { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,//核心线程数 4,//最大线程数 ...原创 2020-02-24 10:20:48 · 555 阅读 · 0 评论 -
CountDownLatch与CyclicBarrier还有Semaphore
CountDownLatch的作用是:计次使用方法:CountDownLatch countDownLatch = new CountDownLatch(num);每个线程执行:countDownLatch.countDown();当num次线程执行完之后主线程:countDownLatch.await();计数结束后,执行await方法后的语句。CyclicBarrier的作用:一起结束...原创 2020-01-15 16:51:34 · 181 阅读 · 0 评论 -
BlockingQueue的使用(可用于实现生产者与消费者模式)
BlockingQueue的含义是阻塞队列即在队列满的时候,入队列会阻塞在队列空的时候,出队列会阻塞特殊之处在于阻塞,所以我们就了解两个方法put(Object obj):在队列满时阻塞,直到队列不满,或者线程中断take():在队列为空时阻塞,直到队列插入新值,或者线程中断分类:ArrayBlockingQueue实现是数组(构造参数必须传数组长度参数)LinkedBlocki...原创 2019-10-29 14:59:07 · 174 阅读 · 0 评论 -
多线程编程第三章线程间的通信
wait和notifynotify唤醒随机一个沉睡的线程notifyAll唤醒所有wait(long)不需要唤醒,等待时间到了之后,自动醒通信字节流PipedOutputStream与PipedInputStream字符流PipedWriter与PipedReader上述两个流,就算不在线程中也是可以的,区别只是一个读成byte[],一个读成char[]实战交叉的注意:volatil...原创 2019-02-27 20:15:35 · 125 阅读 · 0 评论 -
多线程编程第二章对象与变量的并发访问
synchronized同步方法:synchronized脏读,当只对写操作加锁,而不对读操作加锁时候,可能会出现脏读synchronized锁重入 出现异常时,锁自动释放 synchronized不具有继承性synchronized同步语句块:synchronized(被锁的对象)当synchronized(this)时,被锁的是当前对象volatile关键字:volati...原创 2019-02-26 10:57:37 · 123 阅读 · 0 评论 -
多线程编程第四章Lock的使用
使用ReentrantLock lock.lock();//此方法相当于上锁lock.unlock();//此方法相当于释放锁Condition condition = lock.newCondition();condition.await();//相当于wait()condition.signal();//相当于nontifycondition.signalAll();//相当于no...原创 2019-03-05 15:10:34 · 1278 阅读 · 0 评论 -
多线程编程第六章单例模式与多线程
单例模式的目的就是只需要生成一个,所以在多线程下就要小心了序列化和反序列化时,如果要保持单例,就写readResolve方法饿汉模式public class MyObject implements Serializable{ private static MyObject myObject = new MyObject(); /** * */ private static ...原创 2019-03-09 15:04:22 · 63 阅读 · 0 评论 -
多线程编程第七章拾漏补遗
线程的状态NEW:初始化RUNNABLE:执行中BLOCKED:等待锁WAITING:执行wait方法后TIMED_WAITING:sleep后TERMINATED:结束状态线程组线程组不是指多个线程组成个数组,而是ThreadGroup线程组内可以有线程,也可以有线程组如果创建线程时,不设置线程组,自动归属为当前线程组根线程组为system线程组停止,则其子线程孙线程都停...原创 2019-03-11 19:13:15 · 140 阅读 · 0 评论 -
多线程编程第五章定时器Timer的使用
private static Timer timer = new Timer();private static Timer timer = new Timer(true);//是守护线程,默认为falsetimer.schedule(TimerTask task,Date date);//如果date早于此时,直接执行;task是依次执行的timer.schedule(TimerTask t...原创 2019-03-08 10:07:36 · 168 阅读 · 0 评论 -
线程池
参考地址:https://blog.csdn.net/djzhao/article/details/82192918#commentBox如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处理实际的用户请求的时间和资源更多。什么时候使用线程池?单个任务处...原创 2019-04-24 17:22:47 · 140 阅读 · 0 评论 -
多线程编程第一章多线程技能
使用方式:继承Thread(本质是实现了Runnable,再加几个方法)或者实现Runnable(执行时,还得套Thread的壳)几个方法:1、isAlive2、sleep3、currentThread4、getId5、suspend暂停线程、resume恢复线程 6、yield当前线程放弃CPU资源,当前线程继续排队,因为随机,所以也有可能刚放弃又重新占有7、setPriorit...原创 2019-02-22 09:54:27 · 116 阅读 · 0 评论