
JavaConcurrent
文章平均质量分 95
Java并发编程。
boonya
资深Java,热衷大数据,Python爬虫,持续探索副业中,有需要的可以加我微信联系:boonya221
展开
-
Java 并发编程synchornized和volatile的实现原理
目录1. volatile的定义与实现原理2.synchronized的实现原理与应用3.锁的升级与对比3.1.偏向锁3.2.轻量级锁3.3重量级锁4.锁的优缺点对比5.volatile跟Synchronize的区别6.参考文章在并发编程过程中 经常要处理一些:可见性 、 原子性 、 有序性的问题。“本文主要介绍synchronized和volatile到实现原理”synchronized和volatile几乎是java面试基础部分必会,不会你就吃...原创 2021-04-27 20:46:19 · 750 阅读 · 6 评论 -
Java队列和线程池消费处理的简单设计
目录实现目标目标分析线程池设计队列与线程池结合实现目标队列缓冲业务数据 线程空闲忙碌识别 任务处理的进度控制目标分析进度控制:需要将队列里面总任务和线程消费的任务进行记录,实现一个completed/total 这样的控制。线程池控制:线程池使用计数器,在完成任务和新增任务进行原子操作维护计数器数量。线程池设计线程池实际上就是一个线程的池化处理,一般会初始化几个线程,需要使用线程时从池子里面拿,池子里面的总容量占用多少可以用来标记线程繁忙和空闲。线程池的设...原创 2020-12-03 13:08:05 · 1694 阅读 · 0 评论 -
Java并发编程线程任务返回值及顺序问题解决方案
目录核心知识点无返回值并发执行顺序控制有返回值或先后顺序控制Future FutureTask CompletionService CompletableFutrue比较CountDownLatchCyclicBarrierFutureTaskCompletionServiceCompletableFuture核心知识点无返回值并发执行顺序控制...原创 2020-04-01 14:13:25 · 1708 阅读 · 0 评论 -
Java中使用Atomic*实现原子锁线程安全
原子锁类型是JDK Atomic*相关的类。如AtomicInteger、AtomicLong 等等。package com.forestar.xht.util;import java.util.concurrent.atomic.AtomicInteger;/** * 原子锁 * * @author PJL * */public class AtomicLock {...原创 2019-11-11 21:28:50 · 1404 阅读 · 0 评论 -
Java并发编程实践:Callable异步回调Future、FutureTask用法
Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到。FutureTask实现了两个接口,Runnable和Future,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值,那么这个组合的使用有什么好处呢?假设有一个很耗时的返回值需要计算,并且这个返回值不是立刻需要的话,那么就可以使用这个组合,用另原创 2017-04-05 15:11:04 · 10074 阅读 · 3 评论 -
Java线程使用同步锁交替执行打印奇数偶数
对同一个对象进行多线程操作时,如何保证线程执行结果的一致性?我们需要对线程操作对象加同步锁。(这是一道面试题)需求描述1-20个数字A线程打印奇数:1,3,5,7,9,11,13,15,17,19B线程打印偶数:2,4,6,8,10,12,14,16,18,20C线程在AB两个线程执行完了之后打印结果:“success”。线程代码实现Num.javapackage...原创 2019-01-14 23:12:14 · 3712 阅读 · 7 评论 -
Java 并发操作之for foreach中避免remove/add操作问题
此问题在阿里编程规范中也有提及,为什么不建议foreach或者for里面执行add/remove原因是遍历的对象长度改变之后引起并发异常,轻则抛异常重则tomcat服务挂掉。这里以一个老项目中定期移除Token为例。目录Java并发remove代码问题代码解决方法Tomcat异常输出日志Timer的调用Tomcat服务重载问题Java并发remove代码问题代码...原创 2019-04-16 16:28:06 · 1395 阅读 · 1 评论 -
Java Map取值累加的线程安全问题
昨天在开发者头条上面看的一篇文章针对Map相关的线程安全讲解说的很好,今天根据思路还原了场景(隔壁老王半夜为何尖叫?这例子说的有点让老王很忙)。Java代码:package com.boonya.concurrent;import java.util.HashMap;import java.util.Hashtable;import java.util.concurrent.Co...原创 2019-04-23 13:53:00 · 1635 阅读 · 0 评论 -
Java并发编程:CountDownLatch线程等待同步辅助类
原文地址:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.htmljava.util.concurrent中CountDownLatch类java.lang.Object继承 java.util.concurrent.CountDownLatch 公共类CountD...原创 2019-08-19 23:14:53 · 324 阅读 · 0 评论 -
Java并发编程:CyclicBarrier可重用线程组等待同步辅助类
原文地址:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.htmljava.util.concurrent中类CyclicBarrierjava.lang.Object继承 java.util.concurrent.CyclicBarrier中 公共类CyclicBa...原创 2019-08-19 23:25:59 · 547 阅读 · 0 评论 -
Java并发编程:并发编程基础各种锁详细介绍
转载自并发编程网 – ifeve.com目录一、前言二、 什么是线程安全问题三、 什么是共享变量可见性问题四、原子性4.1 介绍4.2 原子变量类五 CAS介绍六、什么是可重入锁七、Synchronized关键字7.1 Synchronized介绍7.2 Synchronized同步实例八、 ReentrantReadWriteLock介绍九...转载 2019-08-25 15:09:42 · 500 阅读 · 1 评论 -
Java并发编程规则:有状态的线程安全对象在线程池中使用不一定就是线程安全的
如题:Java并发编程规则>有状态的线程安全对象在线程池中使用不一定就是线程安全的。在线程安全里面我们可以用的几个关键字是:volatile、Synchronized,另外状态变量我们可以使用原子变量。如果我们在编写了一个状态安全的线程类后,却不慎使用线程池,那么也会导致线程不安全问题产生。原创 2017-03-22 17:33:36 · 1304 阅读 · 0 评论 -
Java并发编程实践(Java concurrency in practice)在线示例学习
学习Java并发编程,这里提供一个快速学习通道:http://jcip.net.s3-website-us-east-1.amazonaws.com/,在这里你可以快速地获取到学习资源代码示例。在线文档:http://jcip.net.s3-website-us-east-1.amazonaws.com/annotations/doc/index.html在线示例:http://j原创 2015-03-19 20:55:04 · 3636 阅读 · 0 评论 -
Java并发编程规则:同步容器与并发容器
同步性和并发性都是线程安全的知识,只要同时满足条件就可以编写支持并发线程安全的程序。同步容器首先,同步容器是线程安全的。Java中设计了同步容器的数据结构对象,如:Vector和HashTable。但必须说明的是,同步容器在复合操作(迭代、运算、逻辑处理等)时如果没有线程同步策略,那么程序就不是线程安全的。Java定义Vector是线程安全的。但是在多线程环境下,多个线程进行remove、原创 2016-12-22 11:53:11 · 1726 阅读 · 0 评论 -
40个Java多线程问题总结
From:http://www.cnblogs.com/xrq730/p/5060921.html1、多线程有什么用?一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个转载 2015-12-23 09:55:02 · 1200 阅读 · 0 评论 -
通过Hash用锁控制并发
From:http://m.oschina.net/blog/673008 1. 分段锁 借鉴concurrentHashMap的分段思想,先生成一定数量的锁,具体使用的时候再根据key来返回对应的lock。这是几个实现里最简单,性能最高,也是最终被采用的锁策略,代码如下:/** * 分段锁,系统提供一定数量的原始锁,根据传入对象的哈希值获取对应的锁并加锁 *转载 2016-05-11 14:41:46 · 2969 阅读 · 0 评论 -
Java并发编程规则:构建封闭的线程限制
访问共享、可变的数据要求使用同步。一个可以避免同步的方式就是不提供共享数据。如果数据仅在单线程中访问,就不需要提供同步。线程封闭是实现线程安全的最简单的方式之一。当一个对象封闭在一个线程中时,这种做法会自动成为线程安全的,即使封闭的对象本身不是线程安全的。——《Java并发编程实践》代码级别的Ad-hoc线程限制:此种情况是,线程的维护任务全部落在实现上。通过可见性修饰符来控制目标对象原创 2016-12-12 16:55:25 · 901 阅读 · 0 评论 -
Java并发编程规则:不可变对象永远是线程安全的
创建后状态不能被修改的对象叫作不可变对象。不可变对象天生就是线程安全的。它们的常量(变量)是在构造函数中创建的,既然它们的状态无法被修改,那么这些常量永远不会被改变——不可变对象永远是线程安全的。不可变性的理解:无论是Java语言规范还是Java存储模型都没有对不可变性做出正式的定义。不可变性并不是将域简单地等于将对象的所有变量都声明为final类型,所有域都是final类型的对象仍然可以原创 2016-12-12 18:06:14 · 9434 阅读 · 7 评论 -
Java并发编程规则:构建线程安全的共享对象
构建线程安全的共享对象,使其在多线程环境下能够提供安全的访问。编写正确的并发程序关键在于控制共享、可变的状态进行访问管理。synchornized关键字既可以阻塞程序,也可以维护操作的原子性,它是一个线程安全与非线程安全的临界区标识,通过它我们可以控制对象的内存可见性。不得不提到volatile,volatile仅仅是控制可见性,而同步性却不及synchornized。多线程访问共享变量的诡异原创 2016-12-09 18:02:56 · 892 阅读 · 0 评论 -
Java并发编程规则:设计线程安全的类
封装设计:尽管所有的状态都存储在公共静态变量(域)中,仍然能写出线程安全的程序,但比起那些适当封装的类来说,我们难以验证这种程序的线程安全性,也很难再修改它的同步不破坏它的线程安全性。在没有进行全局检查的情况下,封装能够保证线程的安全性。=====设计线程安全类的过程应该包括下面3个基本要素:========1、确定对象状态是由哪些变量组成的;2、确定限制状态变量的不变约束;原创 2016-12-13 17:20:25 · 1576 阅读 · 0 评论 -
Java并发编程规则:判定对象是否存在多线程访问
判定规则:无论何时,只要存在多于一个线程访问给定的状态变量,而其中某个线程会写入该变量,此时必须使用同步来协调对线程的访问。关键字使用:使用关键字synchronized和volatile来实现变量修改的同步。一般将涉及的变量修改的方法改为synchronized修饰的方法public synchronized void change(){} ,将可变对象用synchroniz原创 2016-12-07 16:52:17 · 2046 阅读 · 0 评论 -
Java并发编程规则:无状态对象永远是线程安全的
规则说明:无状态类是指:其本身没有内部变量和外部变量的操作的,在每个用户访问的线程栈中都是一个各自的实例。线程安全的表现:一个线程对该类的访问不会影响其他线程的访问结果。无状态类示例:package net.jcip.examples;import java.math.BigInteger;import javax.servlet.*;import net.jci原创 2016-12-07 17:44:52 · 4316 阅读 · 0 评论 -
Java并发编程规则:原子变量实现线程安全
判定规则:如果一个类中存在变量,并且此变量的操作不是原子操作,那么这个类就是非线程安全的类。在线程产生竞争条件的情况下,多线程访问导致原子性不可保证。常见原子变量:在java.util.concurrent.atomic包下还有很多类,使用这些类可以保证对这些类的诸如“获取-更新”操作是原子性的,从而避发生竞争条件。常见的原子变量: AtomicBoolean //可以用原子原创 2016-12-07 18:10:51 · 2952 阅读 · 0 评论 -
Java并发编程规则:synchronized-锁机制
前面说过的,即使是线程安全的类,也不一定就是线程安全的。当一个不变约束涉及多个变量时,变量间不是彼此独立的:某个变量的值会制约其他变量的值。因此更新一个变量的时候,要在同一原子操作中更新其他变量的值。为了保护状态的一致性,要在单一的原子操作中更新相互关联的状态变量。用锁来保护状态:对于每个可被多个线程访问的可变状态,如果所有访问它的线程在执行时都占有同一个锁,这种情况,我们称这个变原创 2016-12-08 14:17:59 · 1458 阅读 · 0 评论 -
ConcurrentLinkedQueue并发队列和LinkedBlockingQueue阻塞队列的详细用法和示例
参考文章:http://blog.youkuaiyun.com/ac903919/article/details/6967728,http://www.cnblogs.com/linjiqin/archive/2013/05/30/3108188.html1.LinkedBlockingQueue:java.util.concurrentAPI中的解释:[java] view pl转载 2015-09-13 09:04:03 · 2455 阅读 · 0 评论