多线程
文章平均质量分 83
李灵晖
正走在技术道路上的求知者
展开
-
从头认识多线程-4.4 ThreadLocal的实现原理
从头认识多线程-4.4 ThreadLocal的实现原理这一章节我们来讨论一下ThreadLocal的实现原理。1.ThreadLocal的存储一般可以认为是ThreadLocalMap这个内部类来存储,但是如果更加深入一层,其实他的存储是Entry类的可变数组,这个跟HashMap的存储比较相似2.为什么在使用ThreadLocal的时候需要初始化?ThreadLocal的初始化源码: /**原创 2016-06-20 14:19:15 · 1567 阅读 · 1 评论 -
从头认识多线程-2.21 死锁简介
这一章节我们来展示一下死锁。1.代码清单package com.ray.deepintothread.ch02.topic_21;/** * * @author RayLee * */public class DeadLock { public static void main(String[] args) throws InterruptedException { MySe原创 2016-05-16 22:05:19 · 4784 阅读 · 0 评论 -
从头认识多线程-2.20 synchronized同步方法的无限等待与解决方法
这一章节我们讨论一下synchronized同步方法的无限等待与解决方法。1.synchronized同步方法的无限等待package com.ray.deepintothread.ch02.topic_20;/** * * @author RayLee * */public class InfiniteWait { public static void main(String[原创 2016-05-15 20:41:44 · 5386 阅读 · 0 评论 -
从头认识多线程-2.19 synchronized (new object())同步时各种不同类别的监视器以及其引起的问题(常量池的影响)
在这里先向读者们道歉,由于之前的不严谨,从头认识多线程-2.15 证明使用整数属性域作为多线程监视器是不同步的这一章里面的例子有所偏差,导致结论出现偏差,在这里再次道歉,因此,才有今天的这一个章节出现。这一章节我们来讨论一下各种不同类别的监视器以及所引起的问题。1.使用整数作为属性域,而且该属性域就是多线程同步的监视器package com.ray.deepintothread.ch02.topi原创 2016-05-12 21:25:38 · 4317 阅读 · 0 评论 -
从头认识多线程-2.18 同步方法与同步静态代码块持有的是不同的锁
这一章节我们来讨论一下同步方法与同步静态代码块持有的是不同的锁。代码清单:package com.ray.deepintothread.ch02.topic_18;/** * * @author RayLee * */public class SynchClass { public static void main(String[] args) throws Interrupte原创 2016-05-11 18:08:09 · 4243 阅读 · 0 评论 -
从头认识多线程-2.17 同步静态方法和静态代码块
这一章节我们来讨论一些同步静态方法和静态代码块。代码清单package com.ray.deepintothread.ch02.topic_17;/** * * @author RayLee * */public class SynchClass { public static void main(String[] args) throws InterruptedExceptio原创 2016-05-11 15:20:24 · 4181 阅读 · 0 评论 -
从头认识多线程-2.15 解决由同步的synchronized (newobject()) 引起的脏读的方法
这一章节我们来讨论一下解决由同步的synchronized (newobject()) 引起的异步现象和脏读的方法。1.代码清单package com.ray.deepintothread.ch02.topic_14;/** * * @author RayLee * */public class DirtyRead { public static void main(String原创 2016-05-08 14:22:55 · 3929 阅读 · 0 评论 -
从头认识多线程-2.16 证明使用整数属性域作为多线程监视器是不同步的
这一章节接着上一章节最后的错误的思路,我们来证明使用属性域作为多线程监视器是不同步的。1.用同一个属性域作为多线程监视器,是不同步的package com.ray.deepintothread.ch02.topic_16;/** * * @author RayLee * */public class DirtyReadWithSynchBlock { public static原创 2016-05-08 22:01:54 · 3244 阅读 · 0 评论 -
从头认识多线程-2.14 由同步的synchronized (newobject()) 引起的异步现象和脏读
这一章节我们来讨论一下由同步的synchronized (newobject()) 引起的异步现象。1.代码清单package com.ray.deepintothread.ch02.topic_14;/** * * @author RayLee * */public class AsynchOfSynchWithUnSameObject { public static void原创 2016-05-07 22:00:14 · 5572 阅读 · 0 评论 -
从头认识多线程-2.13 synchronized ()代码块不单可以用this,也可以用其他对象
这一章节我们来讨论一下synchronized ()代码块的另一个用法,它不单可以用this,也可以用其他对象。1.代码清单package com.ray.deepintothread.ch02.topic_13;/** * * @author RayLee * */public class ObjectLock { public static void main(String[原创 2016-05-06 16:54:19 · 4131 阅读 · 0 评论 -
从头认识多线程-2.12 synchronized标记的方法和synchronized(this)标记的代码块锁定的是当前对象
这一章节我们来讨论一下synchronized标记的方法和synchronized(this)标记的代码块锁定的是当前对象。1.其实从语句上面我们就已经可以看出synchronized(this)锁定的是当前对象,因为能够使用this的只有指代当前对象(当然,在构造器里面有些this除外)2.代码清单:package com.ray.deepintothread.ch02.topic_12;/原创 2016-05-05 21:36:47 · 2589 阅读 · 1 评论 -
从头认识多线程-2.22 内部类的同步机制跟普通类相同
这一章节主要讨论内部类的同步机制跟普通类相同。1.当同步方法的时候package com.ray.deepintothread.ch02.topic_22;/** * * @author RayLee * */public class SynchOfInnerClass { class InnerClass { private int id = 0; public sy原创 2016-05-17 22:11:35 · 2516 阅读 · 0 评论 -
从头认识多线程-2.23 静态内部类的同步机制跟普通类相同
这一章节主要讨论静态内部类的同步机制跟普通类相同。1.当同步方法的时候package com.ray.deepintothread.ch02.topic_23;/** * * @author RayLee * */public class SynchOfStaticInnerClass { static class InnerClass { private static in原创 2016-05-18 21:21:14 · 1866 阅读 · 0 评论 -
从头认识多线程-2.2 synchronized持有对象锁与类锁的相同点
这一章节我们来讨论一下synchronized持有对象锁。1.当所有方法都不使用同步的时候代码清单package com.ray.deepintothread.ch02.topic_2;public class SynchInstance1 { public static void main(String[] args) throws InterruptedException { MyT原创 2016-04-24 22:33:48 · 4594 阅读 · 0 评论 -
从头认识多线程-目录
第一章 回顾多线程基础1.1 多线程的创建1.2 共享变量与线程安全简介1.3 currentThread()1.4 isAlive()和Sleep()1.5 interrupt()和isInterrupt()1.6 迫使线程停止的方法-异常法1.7 迫使线程停止的方法-异常法的扩展(Sleep的Exception)1.8 迫使线程停止的方法-暴力Stop方法1.9 迫使线程停止的方法-retur原创 2016-04-20 22:05:27 · 3177 阅读 · 0 评论 -
从头认识多线程-4.3 ThreadLocal使用时需要注意的地方
4.3 这一章节我们来讨论一下关于ThreadLocal的使用的时候需要注意的地方ThreadLocal主要的使用是get、set、initialValue这几个方法,具体的使用我们这里不做介绍,下面只是举一些它使用的时候需要注意的地方。1.在get方法的时候出现nullpackage com.ray.deepintothread.ch04.topic_3;public class ThreadLo原创 2016-06-17 15:47:21 · 6358 阅读 · 0 评论 -
从头认识多线程-4.2 对象逸出的其他解决方案-主要是ThreadLocal的应用
这一章节我们来讨论一下对象逸出的其他解决方案。1.由于出现对象逸出都是在多线程环境下,那么,我们换成单线程即可,当然,这个方法基本没有人使用, 因为现在都是多核处理器,为了提升性能,不可能使用单核,但是下面我也给出例子吧。package com.ray.deepintothread.ch04.topic_2;public class Ad_hoc { private int id = 0;原创 2016-06-12 23:00:07 · 3487 阅读 · 0 评论 -
从头认识多线程-3.2 使用volatile声明的变量的写操作是非原子性的
这一章节我们来讨论一下使用volatile声明的变量的各种操作是非原子性的。1.上一章节我们已经提到,volatile把工作内存里面变量的改变同步到主内存, 使得各个线程能够把该变量当成是整体的状态控制2.但是,使用volatile声明的变量的写操作是非原子性的代码清单:package com.ray.deepintothread.ch03.topic_2;public class Volat原创 2016-06-06 22:19:39 · 3991 阅读 · 0 评论 -
从头认识多线程-3.1 使用volatile解决异步死循环
这一章节我们来讨论一下使用volatile解决异步死循环。1.在讨论上面的问题前,我们引入另一个例子:同步死循环代码清单:package com.ray.deepintothread.ch03.topic_1;public class DeadFor { private boolean isStop = false; public boolean isStop() { return原创 2016-06-06 10:44:52 · 4209 阅读 · 0 评论 -
从头认识多线程-4.1 对象的发布(Publish)、逸出(Escape)以及逸出的解决方案
这一章节我们来讨论一下对象的发布与逸出。其实在前两个章节我们都有想应的讨论,只不过有一些不用补充的问题,我将会放到这个章节里面去。1.发布(Publish)当一个对象能够给其他代码引用。package com.ray.deepintothread.ch04.topic_1;import java.util.HashMap;public class Publish { private Ha原创 2016-06-11 21:45:25 · 4609 阅读 · 2 评论 -
从头认识多线程-3.3 synchronized某些解决不了的可视性问题,只能使用volatile来解决
这一章节我们讨论一下synchronized不但具备操作的同步性,还具备volatile的可视性。1.引入之前的异步死循环代码:package com.ray.deepintothread.ch03.topic_3;public class DeadForAsychn { public static void main(String[] args) throws InterruptedEx原创 2016-06-08 11:52:29 · 3343 阅读 · 0 评论 -
从头认识多线程-2.24 修改监视器对同步的影响
这一章节我们来讨论一下修改监视器对同步的影响。1.不修改监视器,同步的package com.ray.deepintothread.ch02.topic_24;/** * * @author RayLee * */public class SynchOfStaticInnerClass { public static void main(String[] args) { T原创 2016-05-20 16:27:07 · 5158 阅读 · 0 评论 -
从头认识多线程-2.3 synchronized持有对象锁与类锁的不同点
这一章节我们来讨论游戏,synchronized持有对象锁与类锁的不同点-两种锁是并行的东西,没有交集。1.同步持有对象锁或者类锁package com.ray.deepintothread.ch02.topic_3;public class SynchInstance5 { public static void main(String[] args) throws InterruptedE原创 2016-04-24 23:01:02 · 4706 阅读 · 0 评论 -
从头认识多线程-2.11 通过同步代码块证明synchronized标记的是对象锁
这一章节我们来讨论一下通过同步代码块证明synchronized标记的是对象锁。1.代码清单:package com.ray.deepintothread.ch02.topic_11;/** * * @author RayLee * */public class ObjectLock { public static void main(String[] args) throws原创 2016-05-03 23:06:28 · 4695 阅读 · 0 评论 -
从头认识多线程-2.10 同步代码块的特殊现象:一半同步,一半异步
这一章节我们来讨论一下同步代码块的一个特殊现象:一半同步,一半异步代码清单:原创 2016-05-03 09:05:52 · 4356 阅读 · 0 评论 -
从头认识多线程-2.9 缓解同步方法的隐患-同步代码块
这一章节我们来讨论一下缓解同步方法的隐患-同步代码块。1.思路:把同步方法,降低同步的粒度,同步到代码块2.根据上一章节的例子,我们把代码修改一下(1)第一种方法,把同步标记移到更新的那一栏里面去,一般来说大部分都是更新的时候需要同步数据package com.ray.deepintothread.ch02.topic_9;/** * 从头认识多线程-2.8 缓解同步方法的隐患-同步代码块原创 2016-05-02 17:10:13 · 5414 阅读 · 0 评论 -
从头认识多线程-1.9 迫使线程停止的方法-return法
这一章节我们来讨论一下另一种停止线程的方法-return1.在主线程上面return,是把所有在运行的线程都停掉package com.ray.deepintothread.ch01.topic_9;public class StopByReturn { public static void main(String[] args) throws InterruptedException {原创 2016-04-17 08:31:56 · 2576 阅读 · 1 评论 -
从头认识多线程-1.8 迫使线程停止的方法-暴力Stop方法
这一章节我们来讨论一下暴力Stop方法。1.使用例子package com.ray.deepintothread.ch01.topic_8;public class StopByStopMethod { @SuppressWarnings("deprecation") public static void main(String[] args) throws InterruptedExce原创 2016-04-16 22:58:10 · 1880 阅读 · 0 评论 -
从头认识多线程-1.7 迫使线程停止的方法-异常法的扩展(Sleep的Exception)
这一章节我们来讨论一下异常法的扩展Sleep的Exception。1.使用情景有些时候我们使用多线程执行一项任务,但是我们会对这个任务的进行时间进行评估,任务某个值之后就是超时,这个时候必须终止任务,并返回信息给客户2.代码清单package com.ray.deepintothread.ch01.topic_7;public class StopBySleep { public stati原创 2016-04-16 22:40:38 · 1958 阅读 · 1 评论 -
从头认识多线程-2.26 synchronized同步代码块在jvm是怎样执行的?
这一章节我们来讨论一下synchronized同步代码块在jvm层面的执行。1.synchronized同步代码块是依赖字节码指令来控制代码清单:package com.ray.deepintothread.ch02.topic_26;/** * * @author RayLee * */public class SynchBlock { private Object objec原创 2016-05-24 11:02:22 · 3850 阅读 · 0 评论 -
从头认识多线程-2.25 synchronized同步方法在jvm是怎样执行的?
这一章节我们来讨论一下synchronized同步方法在jvm层面的执行。1.synchronized同步方法是不依赖字节码指令来控制代码清单:package com.ray.deepintothread.ch02.topic_25;/** * * @author RayLee * */public class SynchMethod { public synchronized原创 2016-05-24 10:48:16 · 2471 阅读 · 0 评论 -
从头认识多线程-1.6 迫使线程停止的方法-异常法
这一章节我们来讨论一下迫使线程停止的方法-异常法。1.伪停止法在介绍异常法前,我们来看一下一个伪停止的例子。一般使用多线程,都是在执行一些循环任务,那么,我只要停止了for,就停止了线程了,这是错误的。例子package com.ray.deepintothread.ch01.topic_6;public class FakeInterruptSample { public static v原创 2016-04-15 15:16:25 · 1892 阅读 · 0 评论 -
从头认识多线程-1.5 interrupt()和isInterrupt()
这一章节我们来讨论一下线程的停止,由于线程的停止方法stop,suppend,resume已经弃用,因此不推荐,现在只能够使用interrupt,但是这个方法只是标记一下这个线程已经停止,没有实质性的停下来的。1.代码清单package com.ray.deepintothread.ch01.topic_5;public class InterruptSample { public stat原创 2016-04-15 14:36:56 · 2510 阅读 · 1 评论 -
从头认识多线程-1.4 isAlive()和Sleep()
这一章节我们来讨论一下多线程里面的isAlive()这个函数。1.含义isAlive()指线程的使用状态,是否起来了2.代码例子(1)在不同的线程运行同一个方法package com.ray.deepintothread.ch01.topic_4;public class IsAliveSample_1 { public static void main(String[] args) {原创 2016-04-12 08:43:16 · 3674 阅读 · 2 评论 -
从头认识多线程-1.3 currentThread()
这一章节我们来讨论一下currentThread()。我们下面通过一段代码来解释几个问题:package com.ray.deepintothread.ch01.topic_3;public class CurrentThreadSample { public static void main(String[] args) { ThreadFive threadFive = new Th原创 2016-04-07 22:45:56 · 2111 阅读 · 1 评论 -
从头认识多线程-1.2 共享变量与线程安全简介
这一章节我们来简单讨论一下共享变量与线程安全简介。1.共享变量没有共享的代码:package com.ray.deepintothread.ch01.topic_2;public class NotShareTheVariables { public static void main(String[] args) { for (int i = 0; i < 3; i++) { Ru原创 2016-04-07 10:38:36 · 1924 阅读 · 1 评论 -
从头认识多线程-1.10 暂停与恢复线程
这一章节我们来讨论一下暂停与恢复线程,也就是resume与suspend1.代码清单package com.ray.deepintothread.ch01.topic_10;public class RusumeAndSuspend { @SuppressWarnings("deprecation") public static void main(String[] args) throw原创 2016-04-17 08:53:42 · 1317 阅读 · 0 评论 -
从头认识多线程-1.12 suspend和resume缺点-不同步
这一章节我们继续来讨论suspend和resume的另一个缺点-不同步。1.代码清单package com.ray.deepintothread.ch01.topic_12;public class SuspendUnSynch { public static void main(String[] args) throws InterruptedException { MyObject原创 2016-04-18 11:38:00 · 1899 阅读 · 1 评论 -
从头认识多线程-1.13 yield在使用前后,计算时间的差别
这一章节我们讨论yield的使用。1.yield的作用当我们使用这个方法的时候,我们会让出cup的控制时间,让其他线程计算2.代码清单package com.ray.deepintothread.ch01.topic_13;public class YieldSample { public static void main(String[] args) throws InterruptedE原创 2016-04-18 11:50:24 · 1854 阅读 · 0 评论 -
从头认识多线程-2.8 同步方法的隐患
这一章节我们来讨论一下同步方法的隐患。1.同步虽然给我们带来数据的一致性,但是,同时也降低了性能,代码清单:package com.ray.deepintothread.ch02.topic_8;import java.sql.Time;/** * * * * @author RayLee * */public class ThreatOfSynch { public原创 2016-04-29 11:11:22 · 4638 阅读 · 0 评论