并发编程
文章平均质量分 79
多线程核心及底层概念,以及常用的并发工具
_present
today is present
展开
-
ThreadLocal的使用场景以及原理源码分析
ThreadLocal一般有两种使用场景:1)保证访问对象的线程安全2)每个线程内保存全局变量保证访问对象的线程安全通常很多工具类并不是线程安全的(典型有SimpleDateFormat和Random),如果我们需要在多线程环境中使用他们,我们可以将它放到ThreadLocal中,保证线程安全。public class TestSimpleDateFormat { @Test public void test1() throws InterruptedException, Exec原创 2020-10-27 21:44:58 · 167 阅读 · 0 评论 -
synchronized作用、性质、用法、缺陷详解
synchronized的作用?官网文档翻译:同步方法支持一种简单的策略来防止线程干扰和内存一致性错误︰如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的。通俗点说就是:能够保证同一时刻只有一个线程执行被synchronized保护的代码块,以达到保证并发安全的效果synchronized的两个用法对象锁包括方法锁(默认锁的对象为this当前实例对象)和同步代码块锁(需要自己指定锁的对象)类锁指synchronized修饰静态方法,或指定锁为class对象(syn原创 2020-10-24 21:12:08 · 740 阅读 · 0 评论 -
实际工程中避免死锁的技巧
1、设置超时超时时间使用Lock锁中tryLock方法的超时放弃机制,在指定时间内获取不到锁就放弃原来占用的锁。破坏死锁的请求与保持条件。/** * 描述: * 用tryLock来避免死锁 */public class TryLockDeadLock implements Runnable{ int flag; static Lock lock1 = new ReentrantLock(); static Lock lock2 = new ReentrantL原创 2020-10-20 20:42:22 · 351 阅读 · 0 评论 -
java代码演示经典哲学家就餐问题,以及解决方案
哲学家就餐问题哲学家每天除了思考就是吃饭,假设一张桌子上坐了5名哲学家,他们吃饭时都必须获取两根筷子,并且他们都有着相同的习惯,先拿起左边的筷子再拿起有右边的筷子,如果获取不到两根筷子就等待。代码演示死锁情况:public class DiningPhilosophers{ public static class Philosopher implements Runnable { private Object leftChopstick; private Ob原创 2020-10-20 20:33:55 · 967 阅读 · 0 评论 -
死锁的定义、危害、发生死锁的四个必要条件以及代码演示
1、什么是死锁前提:首先死锁一定是发生在并发中,在并发中我们为了保证线程安全,会使用一些加锁、信号量的方法,但是使用不当的情况下就造成了死锁。当两个(或者更多)线程(或进程)互相持有对方需要的资源,但又不主动释放,导致所有人都无法继续前进,导致程序陷入无尽的阻塞,这就是死锁。两个线程发生死锁:多个线程发生死锁:如果多个线程之间的依赖关系是环形,存在环路的锁依赖关系,那么也可能会发生死锁。2、死锁的影响死锁的影响在不同的系统中是不一样的,这取决于系统对死锁的处理能力。比如:在数据库中:原创 2020-10-20 20:09:53 · 870 阅读 · 0 评论 -
原子类AtomicLong在高并发环境下性能不好,怎么解决?LongAdder解决及原理分析
我们都知道原子类LongAdder可以在高并发环境下保证线程安全,因此我们在生产环境也会经常用到它,但是在高并发环境下它的性能却不是那么好。我们该怎么解决呢?要想解决这个问题,我们必须清楚为什么在高并发环境下,AtomicLong的效率会变低。AtomicLong底层运用的是CAS算法,是一种无锁保证线程安全的算法,在一般情况下可以提高我们程序的运行效率,但是在高并发环境下,也会称为我们系统性能的瓶颈。比如在高并发环境下进行累加操作,我们每做一次加法都会将变量的值同步回主存,由于竞争十分激烈,发生冲突原创 2020-10-15 21:40:32 · 668 阅读 · 0 评论 -
线程池中的钩子函数
所谓钩子函数,通俗地将也就是父类定义的一些空实现的方法,子类通过实现这些方法,在程序运行的声明周期中的某个阶段来回调这些方法,实现我们自定义的功能。java的线程池ThreadPoolExecutor为我们提供了三个钩子函数:beforeExecute:在执行任务之前回调afterExecute:在任务执行完后回调terminated:在线程池中的所有任务执行完毕后回调作用我们可以使用钩子方法在线程池执行任务的前后做一些事情,比如:日志记录,数据统计等等。使用beforeExecute实现原创 2020-10-13 20:43:13 · 929 阅读 · 0 评论 -
线程池构造参数详解,添加线程的规则,拒绝策略
ThreadPoolExecutor提供了四种构造函数,但本质都是调用最后一种这里一共有五种参数(long和TimeUnit表示的是KeepAliveTime,后面我直接将这两个参数表示成KeepAliveTime)分别是corePoolSize、maxPoolSize、keepAliveTime、workQueue、threadFactory、handler。我们先来了解一下这些参数的大概含义:参数名类型含义corePoolSizeint核心线程数maxPoolSiz原创 2020-10-13 20:29:35 · 306 阅读 · 0 评论