![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java并发编程
takeuheart
这个作者很懒,什么都没留下…
展开
-
Java并发编程—AQS、final
Java并发编程—AQS、finalAQS AQS 是一个用于构建锁、同步器等线程协作工具类的框架,有了 AQS 以后,很多用于线程协作的工具类就都可以很方便的被写出来,有了 AQS 之后,可以让更上层的开发极大的减少工作量,避免重复造轮子,同时也避免了上层因处理不当而导致的线程安全问题,因为 AQS 把这些事情都做好了。总之,有了 AQS 之后,我们构建线程协作工具类就容易多了。 AQS 最核心的三大部分就是状态、队列和期望协作工具类去实现的获取/释放等重要方法。state状态在 AQS 中原创 2020-07-09 17:47:30 · 130 阅读 · 0 评论 -
Java并发编程—CAS、死锁
Java并发编程—CAS、死锁它的英文全称是 Compare-And-Swap,中文叫做“比较并交换”,它是一种思想、一种算法。在多线程的情况下,各个代码的执行顺序是不能确定的,所以为了保证并发安全,我们可以使用互斥锁。而 CAS 的特点是避免使用互斥锁,当多个线程同时使用 CAS 更新同一个变量时,只有其中一个线程能够操作成功,而其他线程都会更新失败。不过和同步互斥锁不同的是,更新失败的线程并不会被阻塞,而是被告知这次由于竞争而导致的操作失败,但还可以再次尝试。CAS 被广泛应用在并发编程领域中,以原创 2020-07-09 16:57:48 · 398 阅读 · 0 评论 -
Java并发编程—Java内存模型
Java并发编程—Java内存模型JVM内存模型和Java内存模型JVM 内存结构和 Java 虚拟机的运行时区域有关;Java 内存模型和 Java 的并发编程有关。Java 非常需要一个标准,来让 Java 开发者、编译器工程师和 JVM 工程师能够达成一致。达成一致后,我们就可以很清楚的知道什么样的代码最终可以达到什么样的运行效果,让多线程运行结果可以预期,这个标准就是 JMM,这就是需要 JMM 的原因。JMM JMM 是和多线程相关的一组规范,需要各个 JVM 的实现来遵守 JM原创 2020-07-09 11:44:13 · 100 阅读 · 0 评论 -
Java并发编程—线程协作
Java并发编程—线程协作Semaphore 信号量 信号量的一个最主要的作用就是,来控制那些需要限制并发访问量的资源。具体来讲,信号量会维护“许可证”的计数,而线程去访问共享资源前,必须先拿到许可证。线程可以从信号量中去“获取”一个许可证,一旦线程获取之后,信号量持有的许可证就转移过去了,所以信号量手中剩余的许可证要减一。使用流程首先初始化一个信号量,并且传入许可证的数量,这是它的带公平参数的构造函数:public Semaphore(int permits, boolean fair),传入两原创 2020-07-09 11:02:04 · 111 阅读 · 0 评论 -
Java并发编程—ThreadLocal、Future
Java并发编程—ThreadLocal、FutureThreadLocal使用场景场景1,ThreadLocal 用作保存每个线程独享的对象,为每个线程都创建一个副本,每个线程都只能修改自己所拥有的副本, 而不会影响其他线程的副本,这样就让原本在并发情况下,线程不安全的情况变成了线程安全的情况。这种场景通常用于保存线程不安全的工具类,典型的需要使用的类就是 SimpleDateFormat。场景2,ThreadLocal 用作每个线程内需要独立保存信息的场景,供其他方法更方便得获取该信息,每个线程原创 2020-07-09 09:17:16 · 481 阅读 · 0 评论 -
Java并发编程—原子类
Java并发编程—原子类原子类 在编程领域里,原子性意味着“一组操作要么全都操作成功,要么全都失败,不能只操作成功其中的一部分”。而 java.util.concurrent.atomic 下的类,就是具有原子性的类,可以原子性地执行添加、递增、递减等操作。比如之前多线程下的线程不安全的 i++ 问题,到了原子类这里,就可以用功能相同且线程安全的 getAndIncrement 方法来优雅地解决。 原子类的作用和锁有类似之处,是为了保证并发情况下线程安全。不过原子类相比于锁,有一定的优势:粒度原创 2020-07-08 16:29:23 · 166 阅读 · 0 评论 -
Java并发编程—阻塞队列
Java并发编程—阻塞队列并发队列 Java 提供的线程安全的队列(也称为并发队列)分为阻塞队列和非阻塞队列两大类。 阻塞队列的典型例子就是 BlockingQueue 接口的实现类,BlockingQueue 下面有 6 种最主要的实现,分别是 ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、SynchronousQueue、DelayQueue、PriorityBlockingQueue 和 LinkedTransferQueue 非阻塞并发原创 2020-07-08 14:28:37 · 349 阅读 · 1 评论 -
Java并发编程—并发容器
Java并发编程—并发容器HashMap是线程不安全的public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.ne原创 2020-07-07 11:44:46 · 94 阅读 · 0 评论 -
Java并发编程基础—锁
Java并发编程基础—锁锁的7大分类偏向锁/轻量级锁/重量级锁;特指 synchronized 锁的状态,通过在对象头中的 mark word 来表明锁的状态1)如果锁没有竞争,就不需要上锁了,打个标记即可,这就是偏向锁2)不存在实际竞争,或者竞争时间很短,用CAS就可以解决,这就是轻量级锁3)开销较大,会让申请却拿不到锁的进程陷入阻塞状态锁升级的路径:无锁→偏向锁→轻量级锁→重量级锁。可重入锁/非可重入锁;1)可重入锁指的是线程当前已经持有这把锁了,能在不释放这把锁的情况下,再次获原创 2020-07-06 09:07:49 · 209 阅读 · 0 评论 -
Java并发编程基础—线程池
Java并发编程基础—线程池如果每个任务都创建一个线程会带来哪些问题?第一点,反复创建线程系统开销比较大,每个线程创建和销毁都需要时间,如果任务比较简单,那么就有可能导致创建和销毁线程消耗的资源比线程执行任务本身消耗的资源还要大。第二点,过多的线程会占用过多的内存等资源,还会带来过多的上下文切换,同时还会导致系统不稳定。使用线程池的好处第一点,线程池可以解决线程生命周期的系统开销问题,同时还可以加快响应速度。因为线程池中的线程是可以复用的,我们只用少量的线程去执行大量的任务,这就大大减小了线程生命原创 2020-07-03 15:49:09 · 192 阅读 · 0 评论 -
Java并发编程基础—线程安全
Java并发编程基础—线程安全 《Java Concurrency In Practice》的作者 Brian Goetz 对线程安全是这样理解的,当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行问题,也不需要进行额外的同步,而调用这个对象的行为都可以获得正确的结果,那这个对象便是线程安全的。3种典型的线程安全问题1)运行结果错误;2)发布和初始化导致线程安全问题;3)活跃性问题。死锁,死锁是指两个线程之间相互等待对方资源,但同时又互不相让,都想自己先执行活锁,原创 2020-07-01 17:26:18 · 119 阅读 · 0 评论 -
Java并发编程—线程基础
Java并发编程—线程基础线程的实现方式1)实现Runnable接口2)继承Thread类3)线程池,默认采用 DefaultThreadFactory ,它会给线程池创建的线程设置一些默认值,最终是通过Thread类创建线程的4)实现Callable接口,Callable 和与之相关的 Future、FutureTask,它们可以把线程执行的结果作为返回值返回5)定时器Timer。。。。。。实现线程的本质Runnable实现线程需要调用start()方法,它的本质也是调用run()方法原创 2020-07-01 15:47:34 · 156 阅读 · 0 评论