随笔分类 - 多线程编程
一致性
摘要:线程安全:多个线程之间的切换不会导致该接口的执行结果存在二义性。 分布式一致性:数据的多份副本,当对一个副本进行修改时,其它的副本的值也要与其保持一致。 数据库一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。保证数据库一致性是指当事务完成时,必须使所有数据都具有一致的状态。
阅读全文
mysql的ACID的理解
摘要:这是在网上copy下来的ACID的概念,可以直接跳过看后面: 1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物
阅读全文
AQS详解(AbstractQueuedSynchronizer)
摘要:Intrinsic VS explicity 1. 不一定保证公平 1. 提供公平和非公平的选择 2. 无 2. 提供超时的功能 3. 无 3. 提供对中断的响应 4. 无 4. 提供try... 的方法 5. 保证获取锁和释放锁的一致性 5. 需要自己保证 6. 只有一个conditionQueu
阅读全文
AQS详解
摘要:AQS依赖于一个FIFO队列和一个int表示的状态. 具体的实现类可以自己去保存别的状态, 但是只有这个int表示的状态是require和release的, 子类自己的状态是做辅助作用的. 我们的同步器应该是通过把AQS的子类作为一个内部的代理类来实现,最好不要直接继承AQS,因为AQS的一些api
阅读全文
对ConditionQueue和锁的理解
摘要:1. 什么时候使用conditionQueue 使用conditionQueue的一个最基本的条件是,操作和状态相关,而且是多线程同时访问的状态. 也就是说在使用conditionQueue的时候, 是我们自己在管理一个对象内部的状态, 还有同步的机制, 所以要制定好一个通用的协议来保证正常运行.
阅读全文
Synchronizer解析(为AQS打个铺垫)
摘要:ReentranceLock 和 Semaphore有很多共同点,他们都像是一个gate一样, 来控制让哪些线程阻塞,让哪些线程通过. 不同的是,ReentranceLock允许通过的量是1,Semaphore允许多个线程通过, 所以在这个角度看,ReentranceLock和Semaphore是可
阅读全文
IntricCondition和expliciteCondition比较
摘要:IntricCondition 和 expliciteCondition 的区别 与 intrinsicLoc和expliciteLock的区别很相似, expliciteCondition提供了更多的功能,比如,fair和unfair的wait,notify 不同conditionPredicte
阅读全文
intrinsicConditionQueue笔记
摘要:一, 使用conditionQueue需要注意的一些点: 一个conditionQueue被多种Predicate condition 使用是很正常的,所以当一个wait的线程被唤醒的时候,很有可能它监听的条件并没有成功,所以在wait醒后,最好再次进行条件的判断. 一定要在wait前就对条件进行判
阅读全文
锁的性能相关
摘要:锁为什么耗性能: 1. 每个线程在被cpu执行的时候, 都会给这个线程分配一定的时间让这个线程执行, 这段时间不会被信号中断. 2. 在获取锁的时候, 如果竞争很激烈, 这个线程会被挂起, 所以, 如果获取锁的操作很多, 这个线程就会频繁被挂起, 无法利用完cpu分配给它的时间, 时间都浪费 在了c
阅读全文
对/proc/cpuinfo文件下的各个参数的说明及实践
摘要:我们通常要检查系统的cpu的相关信息,之前在进行查看cpu的信息的时候,我最长用的方式 是,直接将/etc/cpuinfo下的所有的内容进行显示,然后通过对全部文件的查看,来提取我们需要的信息,虽然查看过这方面的信息,但是对于这个文 件中的内容了解的还是不够详细,今天看到了一篇文章写的不错,作为一个
阅读全文
java锁的种类以及辨析(一):自旋锁
摘要:锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及。本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解 惑。 1、自旋锁 自旋
阅读全文
自旋锁代替互斥锁的实践
摘要:原文地址 译文地址 译者:小鱼儿 校对:梁海舰 自旋锁和互斥锁是多线程程序中的重要概念。 它们被用来锁住一些共享资源, 以防止并发访问这些共享数据时可能导致的数据不一致问题。 但是它们的不同之处在哪里? 我们应该在什么时候用自旋锁代替互斥锁? 理论分析 从理论上说, 如果一个线程尝试加锁一个互斥锁的
阅读全文
Leader/Follower多线程网络模型介绍
摘要:之前分享过《轻量级 web server Tornado代码分析》,介绍了目前我们采用nginx + tornado的方式搭建升级、配管、数据中心等各类服务组建客户端迭代体系。最近注意到,淘宝目前公开了其网络服务器源代码Tengine。根据官方介 绍,Tengine是由淘宝网发起的Web服务器项目。
阅读全文
java.util.concurrent.locks.LockSupport (讲得比较细)
摘要:转自: https://my.oschina.net/readjava/blog/282882 摘要: 要学习JAVA中是如何实现线程间的锁,就得从LockSupport这个类先说起,因为这个类实现了底层的一些方法,各种的锁实现都是这个基础上发展而 来的。这个类方法很少,但理解起来需要花费一点时间,
阅读全文
Thread.sleep() 和 Thread.yield() 区别
摘要:1. Thread.yield(): api中解释: 暂停当前正在执行的线程对象,并执行其他线程。 注意:这里的其他也包含当前线程,所以会出现以下结果。 输出结果: 1122 或者 1212 2. Thread.sleep(long millis): 解释:使当前线程暂停millis所指定的毫秒,转
阅读全文
LockSupport的park和unpark的基本使用,以及对线程中断的响应性
摘要:/** * Disables the current thread for thread scheduling purposes unless the * permit is available. * * <p>If the permit is available then it is consum
阅读全文
Fork/Join 型线程池与 Work-Stealing 算法
摘要:JDK 1.7 时,标准类库添加了 ForkJoinPool,作为对 Fork/Join 型线程池的实现。Fork 在英文中有 分叉 的意思,而 Join 有 合并 的意思。ForkJoinPool 的功能也是如此:Fork 将大任务分叉为多个小任务,然后让小任务执行,Join 是获得小任务的结果,
阅读全文
Task的运行原理和工作窃取(work stealing)
摘要:在net4.0以前,当调用ThreadPool.QueueUserWorkItem方法往线程池中插入作业时,会把作业内容(其实就是一个委托)放到线程池中的一个全局队列中,然后线程池中的线程按照先进先出的方式取出作业,并处理。 如下图中的方式,主程序创建了Item到Queue中,然后分配到了各个工作线
阅读全文
http://blog.csdn.net/hongchangfirst/article/details/26004335
摘要:悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的 关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁(O
阅读全文
设置主线程等待子线程执行的方法
摘要:首先要注意的是: 1、java的Main线程结束之后,子线程还在运行。其实主线程已经退出了,但是JVM守护线程会等待所有的线程结束,才会退出。所以我们可以看到,子线程依然在继续执行。 2、那么如何实现主线程等待子线程的执行之后再结束,这个就要用到CountDownLatch,设置要执行的线程的个数,
阅读全文