并发多线程
文章平均质量分 91
菜鸡小王子
这个作者很懒,什么都没留下…
展开
-
方法锁、对象锁和类锁区别
引言:结合synchronized进行分析。synchronized用来处理多个线程同时访问同一个类的一个代码块、方法,甚至这个类。(1)修饰代码块时,需要一个reference对象作为锁的对象。(2)修饰方法时,默认是当前对线作为锁的对象。(3)修饰类时,默认是当前类的Class对象作为锁的对象。1、对象锁当一个对象中有同步方法或者同步块,线程调用此对象进入该同步区域原创 2017-05-22 16:15:09 · 5993 阅读 · 2 评论 -
阻塞非阻塞与同步异步的区别
链接:https://www.zhihu.com/question/19732473/answer/20851256感觉知乎上面这个讲的很好,于是转载了“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous转载 2017-08-20 16:17:40 · 275 阅读 · 0 评论 -
Lock和synchronized比较详解
锁的种类可重入锁:如果锁具备可重入性,则称作为可重入锁。像synchronized和ReentrantLock都是可重入锁,可重入性在我看来实际上表明了锁的分配机制:基于线程的分配,而不是基于方法调用的分配。举个简单的例子,当一个线程执行到某个synchronized方法时,比如说method1,而在method1中会调用另外一个synchronized方法method2,此时线程原创 2017-08-14 16:24:22 · 398 阅读 · 0 评论 -
Java内存模型(JMM)
Java内存模型: Java内存模型的主要目标:定义在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。原创 2017-07-07 16:32:23 · 282 阅读 · 0 评论 -
Condition条件变量详解
java中条件变量都实现了java.util.concurrent.locks.Condition接口,条件变量的实例化是通过一个Lock对象上调用newCondition()方法来获取的,这样,条件就和一个锁对象绑定起来了。因此,Java中的条件变量只能和锁配合使用,来控制并发程序访问竞争资源的安全。 条件变量的出现是为了更精细控制线程等待与唤醒,在Java5之前,线程的等待与唤醒依靠的原创 2017-08-20 20:48:33 · 1242 阅读 · 0 评论 -
java.util.concurrent.locks包
java.util.concurrent.locks包为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。该框架允许更灵活地使用锁和条件,但以更难用的语法为代价。 Lock 接口支持那些语义不同(重入、公平等)的锁规则,可以在非阻塞式结构的上下文(包括 hand-over-hand 和锁重排算法)中使用这些规则。主要的实现是 ReentrantLock。原创 2017-08-20 20:59:52 · 386 阅读 · 0 评论 -
ArrayBlockingQueue和LinkedBlockingQueue源码分析(jdk1.8)
多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 什么叫线程安全?这个首先要明确。线程安全的类 ,指的是类内共享的全局变量的访问必须保证是不受多线程形式影响原创 2017-08-20 22:16:25 · 447 阅读 · 0 评论 -
ArrayBlockingQueue和LinkedBlockingQueue比较
ArrayBlockingQueue和LinkedBlockingQueue异同比较相同点:1、LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口;2、LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的队列 内部都是使用ReentrantLock和Cond原创 2017-08-20 22:18:53 · 1107 阅读 · 0 评论 -
生产者/消费者问题的多种Java实现方式
生产者/消费者问题的多种Java实现方式 实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的。在博文《一种面向作业流(工作流)的轻量级可复用的异步流水开发框架的设计与实现》中将介绍一种生产者/消费者模式的具体应用。生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作转载 2017-08-22 15:16:13 · 324 阅读 · 1 评论 -
实现线程安全的几种方式
实现线程安全的几种方式原创 2017-07-08 10:50:31 · 4236 阅读 · 0 评论 -
Java锁的种类和区别
在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。公平锁/非公平锁公平锁是指多个线程按照申请锁的顺转载 2017-08-28 19:45:44 · 3905 阅读 · 0 评论 -
Synchronized底层优化
Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)Java并发编程系列:Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理Java并发编程:Synchronized底层优化(轻量级锁、偏向锁)Java 并发编程:线程间的协作(wait/notify/sleep/yield/jo转载 2017-09-07 09:43:16 · 320 阅读 · 0 评论 -
ConcurrentLinkedQueue源码分析
最近一段时间在学习Java并发编程,研究了下AbstractQueuedSynchronizer、ConcurrentHashMap及本文涉及的ConcurrentLinkedQueue的实现。网上关于ConcurrentHashMap的源码分析很多,但关于ConcurrentLinkedQueue的源码分析较少。且随着时间推移,JDK对ConcurrentLinkedQueue的实现方式也进行了转载 2017-08-31 14:51:49 · 353 阅读 · 0 评论 -
线程池中为什么要使用阻塞队列?
在线程池中活跃线程数达到corePoolSize时,线程池将会将后续的task提交到BlockingQueue中,主要是考虑到:在一个task提交到线程池时,假设可以被线程池中的一个线程执行,则进行以下过程:exeute ---》addWorker(Runnable command, boolean core)---》workers.add(w),启动线程执行任务(获取全局锁Reentra原创 2017-09-10 14:18:10 · 5283 阅读 · 0 评论 -
操作系统中锁的实现原理
在多线程编程中,为了保证数据操作的一致性,操作系统引入了锁机制,用于保证临界区代码的安全。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。所谓的锁,说白了就是内存中的一个整型数,拥有两种状态:空闲状态和上锁状态。加锁时,判断锁是否空闲,如果空闲,修改为上锁状态,返回成功;如果已经上锁,则返回失败。解锁时,则把锁状态修转载 2017-09-19 09:54:38 · 6100 阅读 · 0 评论 -
wait必须放在while循环里面的原因探析
先看一段代码: import java.util.*; public class EarlyNotify extends Object { private List list; public EarlyNotify() { list = Collections.synchroniz原创 2017-08-18 10:02:30 · 7897 阅读 · 2 评论 -
乐观锁和悲观锁定义
悲观锁(Pessimistic Lock),正如其名,具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。比如sync原创 2017-08-17 22:23:01 · 1758 阅读 · 0 评论 -
乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
转载出自于:Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synch转载 2017-08-17 21:08:48 · 430 阅读 · 0 评论 -
Java实现多线程的三种方式
Java实现多线程的三种方式原创 2017-07-13 19:02:38 · 228 阅读 · 0 评论 -
java.concurrent包常见类详解
一、线程安全的集合类1、CopyOnWriteArrayListArrayList的一个线程安全的实体。其中所有可变操作都是通过对底层数组经常一次新的复制来实现的。比如add(E)时,容器自动copy一次出来然后在尾部添加。看源码:public boolean add(E e) { final ReentrantLock lock = this.lock;原创 2017-07-20 10:02:48 · 4089 阅读 · 0 评论 -
Java线程状态的转换
Java线程间的状态转换:可以分为五个状态:新建,可运行,运行,阻塞,死亡。其中阻塞分为:等待阻塞,同步阻塞,其他阻塞原创 2017-07-20 15:57:49 · 373 阅读 · 0 评论 -
普通锁和可重入锁分析
简单锁在讲述简单锁的实现之前,我们先来看一个锁的应用例子:public class Counter{ private Lock lock = new Lock(); private int count = 0; public int inc(){ lock.lock(); this.count++; lock.unlo转载 2017-07-18 15:15:48 · 366 阅读 · 0 评论 -
AtomicInteger源码分析
AtomicInteger源码分析转载 2017-07-31 11:39:08 · 279 阅读 · 0 评论 -
深入研究java.lang.ThreadLocal类
ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。转载 2017-07-20 17:22:31 · 222 阅读 · 0 评论 -
JAVA四种线程池详解
Java提供的四种线程池的特点:1. 重用存在的线程,减少对象创建、消亡的开销,性能佳。2. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。3. 提供定时执行、定期执行、单线程、并发数控制等功能。原创 2017-07-16 09:09:43 · 1021 阅读 · 0 评论 -
ThreadLocal
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。二、接口方法在JDK5.0中,ThreadLocal已经支持泛型。转载 2017-07-08 16:15:59 · 385 阅读 · 0 评论 -
Java线程池源码解析(ThreadPoolExecutor)
转载地址:深入理解java线程池—ThreadPoolExecutor几句闲扯:首先,我想说java的线程池真的是很绕,以前一直都感觉新建几个线程一直不退出到底是怎么实现的,也就有了后来学习ThreadPoolExecutor源码。学习源码的过程中,最恶心的其实就是几种状态的转换了,这也是ThreadPoolExecutor的核心。花了将近小一周才大致的弄明白ThreadPoolExec...转载 2017-08-08 20:03:04 · 496 阅读 · 0 评论 -
Java线程池ThreadPoolExecutor小结
Java语言为我们提供了两种基础线程池的选择:ScheduledThreadPoolExecutor和ThreadPoolExecutor。它们都实现了ExecutorService接口(注意,ExecutorService接口本身和“线程池”并没有直接关系,它的定义更接近“执行器”,而“使用线程管理的方式进行实现”只是其中的一种实现方式)。这篇文章中,我们主要围绕ThreadPoolExecutor类进行讲解。原创 2017-08-08 21:23:23 · 297 阅读 · 0 评论 -
ThreadLocal理解
核心理解:首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来原创 2017-08-09 20:17:42 · 223 阅读 · 0 评论 -
wait/notify/notifyAll实现线程间通信
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17225469 在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信。在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调用notify()方法或notifyAll()方法),在线程转载 2017-08-10 15:36:28 · 298 阅读 · 0 评论 -
wait与sleep区别
(1)sleep为Thread方法,wait为Object方法(2)sleep不释放同步锁,wait释放同步锁sleep:只是让线程进入睡眠状态,等待一段时间进入可运行状态,不释放同步锁wait:线程进入wait方法之前,需要持有对象锁,进入以后会释放(3) wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,sleep可以在任何地方使用(4原创 2017-08-10 17:28:17 · 383 阅读 · 0 评论 -
死锁的例子以及解决办法
给个死锁的例子:public class TestDeadLock implements Runnable{ public int flag = 0; static Object o1 = new Object(); static Object o2 = new Object(); @Override public void run() {原创 2017-09-19 10:18:56 · 2367 阅读 · 1 评论