
线程
文章平均质量分 87
腹黑大壁花
这个作者很懒,什么都没留下…
展开
-
Thread.sleep(0)的意义 时间片与抢占式特点
我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题:假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会 不会被唤醒?某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) 。既然转载 2016-12-06 19:40:49 · 1780 阅读 · 0 评论 -
sun.misc.unsafe类的使用
转载http://blog.youkuaiyun.com/fenglibing/article/details/17138079 这个帖子是关于JAVA中鲜为人知的特性的后续更新,如果想得到下次在线讨论的更新,请通过邮件订阅,并且不要忘了在评论区留下你的意见和建议。 Java是一个安全的开发工具,它阻止开发人员犯很多低级的错误,而大部份的错误都是基于内存管理方面的。如果你想搞破坏,可以使用Unsa转载 2017-05-09 09:42:30 · 716 阅读 · 0 评论 -
Java锁的膨胀过程和优化
首先说一下锁的优化策略。1,自旋锁自选锁其实就是在拿锁时发现已经有线程拿了锁,自己如果去拿会阻塞自己,这个时候会选择进行一次忙循环尝试。也就是不停循环看是否能等到上个线程自己释放锁。这个问题是基于一个现实考量的:很多拿了锁的线程会很快释放锁。因为一般敏感的操作不会很多。当然这个是一个不能完全确定的情况,只能说总体上是一种优化。举个例子就好比一个人要上厕所发现厕所里面有人,他可以:1,等一小会。转载 2017-05-08 22:50:36 · 1513 阅读 · 0 评论 -
Java中CAS详解
转载http://blog.youkuaiyun.com/ls5718/article/details/52563959在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程转载 2017-05-08 22:39:32 · 895 阅读 · 0 评论 -
详解JUC之原子类概述
原子操作在讲 JUC (java.util.concurrent) 的原子类之前呢,我得先介绍一下原子操作在化学变化中,原子(Atom)是不能再分的一种粒子(在物理上还可以分为质子和电子),计算机中的原子操作是指不能分割成若干部分的操作,表示这个操作在执行过程中,是不能被中断的。比如说int i=0;是一个原子操作。而i++则可以分成两步操作,先是计算i+1的值然后第二步是将第一步的计算结果赋值给i原创 2017-05-08 18:54:28 · 1589 阅读 · 0 评论 -
一个小细节引起的悲剧——线程执行顺序错误
悲剧的故事今天在写博客的时候,想弄个例子说明一下非原子操作的线程安全问题,下面就是这个例子public class Main { public static void main(String[] args) { Counter counter = new Counter(); // 开启1000条线程让counter的count++,理想结果应该是1000原创 2017-05-08 17:24:06 · 823 阅读 · 0 评论 -
详解JUC之锁——LockSupport类(04)
LockSupportLockSupport看名字叫锁支持,这个玩意的功能跟wait和notify很像,它也是可以阻塞一个线程,然后又可以恢复一个线程,不过有个比较大的区别就是,wait让线程阻塞前,必获取到同步锁。而LockSupport这个哥们比较牛逼,随时随地随便阻塞当前线程,你给它一个线程它就敢让那个线程阻塞。它是通过park()方法阻塞当前线程的,park的意思就是停车咯,然后恢复线程就是原创 2017-05-11 17:25:51 · 1937 阅读 · 0 评论 -
详解JUC之锁——ReentrantLock类(03)
前言在详解JUC之锁——Lock与AQS(02)中我介绍了JUC锁的根基——AQS类还有公平锁和非公平锁,现在就可以正式介绍一下JUC锁家族其中的一个成员——ReentrantLockReentrantLockReentrantLock是一个互斥锁,也是一个可重入锁(Reentrant就是再次进入的意思)。ReentrantLock锁在同一个时间点只能被一个线程锁持有,但是它可以被单个线程多次获取,原创 2017-05-11 17:18:59 · 1276 阅读 · 6 评论 -
详解JUC之锁——Lock与AQS(02)
前言在详解JUC之锁——概述(01)中我对JUC中的锁进行了概述,下面我就介绍一下它们的根基Lock接口和AQS类Lock看名字就知道Lock接口就是JUC中锁的顶级接口,支持语义不同的锁规则,比如说公平锁和非公平锁,独占锁(也可以叫互斥锁)和共享锁等。它最主要的两个方法就是lock()和unlock(),一看就知道是获取锁和释放锁。还有一个比较有趣的方法是boolean tryLock(long原创 2017-05-11 17:07:03 · 1728 阅读 · 0 评论 -
详解JUC之锁——概述(01)
前言在详解JUC之原子类使用及实现中,我介绍了一下JUC中的原子类的使用和实现,现在我就来介绍一下JUC的重磅武器——锁(Lock)同步锁在说JUC中的锁之前,得先说一下它们的前辈——同步锁,有对比才有伤害嘛~同步锁的概念是,不同的线程可以访问一个同步锁,但是在同一个时间点,这个同步锁只能被一个线程获取,而想要却得不到它的线程就必须等待了,直到获取到它才能继续运行。Java是通过synchroniz原创 2017-05-11 10:45:35 · 1722 阅读 · 1 评论 -
Java多线程设计(四)生产者/消费者模式
在生活中,供求关系是很常见的。一个卖烧鸭的,一个买烧鸭的,卖烧鸭的要有烧鸭,买烧鸭的才能买到烧鸭。所以,买烧鸭的要等卖烧鸭的准备好烧鸭,她才有得买。这就是典型的生产者/消费者模式呀。用Java线程描述这些事情,也是可以妥妥的。王大厨开了一间烧鸭店,每天生产100只烧鸭。张大妈今天家里摆酒请客,刚好要买100只烧鸭。王大厨做出的烧鸭都会挂在一个挂钩上,这些挂钩就像是一条队列,一只只烧鸭挂在上面,先做出原创 2016-12-20 21:48:37 · 784 阅读 · 0 评论 -
Java多线程设计(三)线程安全问题
1. 概述我们经常会听到线程安全和非线程安全,比如说StringBuffer 是线程安全的,StringBuilder是非线程安全的。又比如说 Vector 是线程安全的,ArrayList是非线程安全的,然后又说线程安全的效率相对非线程安全的要低一些等等。那么线程安全和非线程安全到底是什么呢?2. 非线程安全非线程安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。原创 2016-12-19 18:57:57 · 884 阅读 · 0 评论 -
Java多线程设计(二)线程的基本知识(3)线程的协调
1. 概述在上一节Java多线程设计(二)线程的基本知识(2)共享互斥中,当有一个线程在执行synchronized实例方法时,其它线程就无法执行该方法。这是简单的共享互斥。假设现在我们想做进一步的处理,例如我现在有一个买烧鸡的店,我想只要店里还有烧鸡,我就让厨师等待着,不要做烧鸡先了,当消费者来买完我的烧鸡,我就通知厨师又开始做烧鸡。上面的情景可以用Java中的wait、notify和notify原创 2016-12-19 08:15:06 · 792 阅读 · 0 评论 -
Java多线程设计(二)线程的基本知识(2)共享互斥
1. 概述接着上一章内容Java多线程设计(二)线程的基本知识(1),接下来就要谈一下线程的共享互斥。2. 线程的共享互斥多个线程在操作到同一个实例的时候,就可能会造成重大的灾难。最经典的就是银行取款的例子。在去银行取款的时候,比如说你取100,程序先判断你的余额够不够100,不够就取款失败,够就给你100然后将你的余额减去100。模拟代码如下public class Bank { priva原创 2016-12-18 16:31:54 · 854 阅读 · 0 评论 -
Java多线程设计(二)线程的基本知识(1)
1.概述在上一篇文章Java多线程设计(一)由浅入深介绍进程与线程我已结介绍了线程以及与线程相关的知识,现在就开始正式说一下Java中的线程的基本知识。2.线程的启动其实我们最经常看到的线程就主线程,就是做main方法中的任务,但是它是被虚拟机启动的,下面就来看看我们自定义的线程是怎么启动的。自定义线程有两种方法可以启动(1)利用Thread类的子类实例启动线程(2)利用Runnable接口的实原创 2016-12-18 10:50:10 · 1034 阅读 · 2 评论 -
Java多线程设计(一)由浅入深介绍进程与线程
概述在了解线程(thread)我们应该先了解一下进程(process),这两个都是操作系统的概念,比较抽象难懂,所以下面我就用自己的理解解释一下这两个概念,不过还是建议大家去看看操作系统相关的书里面的介绍。单任务操作系统在远古的时候(就是上个世纪),个人电脑还没流行,计算机还是一种稀有资源。那时候的操作系统(比如微软的Dos系统),在一个时刻只能处理一个任务,这就是单任务操作系统,然后大家觉得这样子原创 2016-12-17 10:56:13 · 1266 阅读 · 0 评论 -
java中volatile关键字的含义
转载http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html在Java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。 sync转载 2016-11-26 16:22:52 · 832 阅读 · 0 评论 -
详解JUC之原子类使用及实现
前言我在详解JUC之原子类概述这篇文章中介绍了一下原子操作和JUC包下的原子类的类型,现在我就来介绍第一种原子类类型——操作基本类型的原子类操作基本类型的原子类操作基本类型的原子类有3个AtomicInteger:操作int类型AtomicLong:操作long类型AtomicBoolean:操作boolean类型这些操作基本类型数据的原子类的使用是非常简单的,你对基本类型数据的操作,在这些原创 2017-05-09 12:27:41 · 2010 阅读 · 0 评论