从头认识多线程
文章平均质量分 83
深入了解多线程的知识点,为后面的并发做准备
李灵晖
正走在技术道路上的求知者
展开
-
从头认识多线程-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 · 6305 阅读 · 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 · 3443 阅读 · 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 · 4558 阅读 · 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 · 3303 阅读 · 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 · 3945 阅读 · 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 · 4153 阅读 · 0 评论 -
从头认识多线程-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 · 3805 阅读 · 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 · 2446 阅读 · 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 · 5113 阅读 · 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 · 1821 阅读 · 0 评论 -
从头认识多线程-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 · 2495 阅读 · 0 评论 -
从头认识多线程-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 · 4743 阅读 · 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 · 5343 阅读 · 0 评论 -
从头认识多线程-2.19 synchronized (new object())同步时各种不同类别的监视器以及其引起的问题(常量池的影响)
在这里先向读者们道歉,由于之前的不严谨,从头认识多线程-2.15 证明使用整数属性域作为多线程监视器是不同步的这一章里面的例子有所偏差,导致结论出现偏差,在这里再次道歉,因此,才有今天的这一个章节出现。这一章节我们来讨论一下各种不同类别的监视器以及所引起的问题。1.使用整数作为属性域,而且该属性域就是多线程同步的监视器package com.ray.deepintothread.ch02.topi原创 2016-05-12 21:25:38 · 4112 阅读 · 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 · 4201 阅读 · 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 · 4134 阅读 · 0 评论 -
从头认识多线程-2.16 证明使用整数属性域作为多线程监视器是不同步的
这一章节接着上一章节最后的错误的思路,我们来证明使用属性域作为多线程监视器是不同步的。1.用同一个属性域作为多线程监视器,是不同步的package com.ray.deepintothread.ch02.topic_16;/** * * @author RayLee * */public class DirtyReadWithSynchBlock { public static原创 2016-05-08 22:01:54 · 3206 阅读 · 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 · 3881 阅读 · 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 · 5526 阅读 · 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 · 4090 阅读 · 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 · 2551 阅读 · 1 评论 -
从头认识多线程-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 · 4656 阅读 · 0 评论 -
从头认识多线程-2.10 同步代码块的特殊现象:一半同步,一半异步
这一章节我们来讨论一下同步代码块的一个特殊现象:一半同步,一半异步代码清单:原创 2016-05-03 09:05:52 · 4334 阅读 · 0 评论 -
从头认识多线程-2.9 缓解同步方法的隐患-同步代码块
这一章节我们来讨论一下缓解同步方法的隐患-同步代码块。1.思路:把同步方法,降低同步的粒度,同步到代码块2.根据上一章节的例子,我们把代码修改一下(1)第一种方法,把同步标记移到更新的那一栏里面去,一般来说大部分都是更新的时候需要同步数据package com.ray.deepintothread.ch02.topic_9;/** * 从头认识多线程-2.8 缓解同步方法的隐患-同步代码块原创 2016-05-02 17:10:13 · 5364 阅读 · 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 · 4602 阅读 · 0 评论 -
从头认识多线程-2.7 同步是不具备继承性的
这一章节我们来讨论一下同步是不具备继承性的。1.代码清单package com.ray.deepintothread.ch02.topic_7;/** * * * * @author RayLee * */public class SynchronizationDoesNotHaveInheritance { public static void main(String[原创 2016-04-29 10:33:02 · 2501 阅读 · 0 评论 -
从头认识多线程-2.6 当异常出现时,线程自动释放锁
这一章节我们来讨论一下下面的情况:当异常出现时,线程自动释放锁原创 2016-04-28 07:00:41 · 2540 阅读 · 0 评论 -
从头认识多线程-2.5 锁的可重入性
这一章节我们来讨论一下可重入锁。1.什么是可重入锁?一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁。2.特性:(1)同一对象,不同方法,可以获取同样的锁,然后重入package com.ray.deepintothread.ch02.topic_5;public class ReGetInTheLock { public原创 2016-04-27 22:38:51 · 2288 阅读 · 0 评论 -
从头认识多线程-2.4 脏读(DirtyRead)
这一章节我们来讨论一下脏读(DirtyRead)。1.为什么出现脏读?因为代码没有做同步,虽然set方法同步,但是由于get方法一般都会忘了,导致读的值是被写过的2.代码清单(1)由于程序没有同步,并且执行太快,导致脏读package com.ray.deepintothread.ch02.topic_4;public class DirtyRead { public static void原创 2016-04-25 23:00:51 · 7999 阅读 · 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 · 4665 阅读 · 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 · 4551 阅读 · 0 评论 -
从头认识多线程-2.1 局部变量与实例变量的线程安全
这一章节我们来讨论一下局部变量与实例变量的线程安全。1.结论局部变量线程安全的实例变量不是线程安全的2.代码清单package com.ray.deepintothread.ch02.topic_1;public class ThreadSafeOfLocalVariable { public static void main(String[] args) throws Interrupte原创 2016-04-21 22:22:17 · 8097 阅读 · 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 · 3142 阅读 · 0 评论 -
从头认识多线程-1.17 守护线程setDaemon()
这一章节我们来讨论一下守护线程。1.特性守护线程是需要等待其他用户线程结束后才结束的线程,俗称保姆线程2.源码解析/** * Marks this thread as either a {@linkplain #isDaemon daemon} thread * or a user thread. The Java Virtual Machine exits when the原创 2016-04-20 22:01:41 · 4671 阅读 · 0 评论 -
从头认识多线程-1.16 对比不同的优先级
这一章节我们来做一个测试,对比一下不同的优先级会形成怎样的结果?1.代码清单package com.ray.deepintothread.ch01.topic_16;import java.util.Random;public class PrioritySample2 { public static void main(String[] args) throws Interrupted原创 2016-04-19 22:41:21 · 2877 阅读 · 0 评论 -
从头认识多线程-1.15 优先级特性-继承性
这一章节我们来讨论一下优先级的特性-继承性。1代码清单package com.ray.deepintothread.ch01.topic_15;public class PrioritySample { public static void main(String[] args) throws InterruptedException { ThreadOne threadOne = ne原创 2016-04-19 22:11:52 · 1836 阅读 · 0 评论 -
从头认识多线程-1.14 优先级
这一章节我们来讨论一下优先级的使用。1.源码主要就是set和get方法,get比较简单,不列举,下面是set的方法public final void setPriority(int newPriority) { ThreadGroup g; checkAccess(); if (newPriority > MAX_PRIORITY || newPri原创 2016-04-19 21:55:57 · 1474 阅读 · 0 评论 -
从头认识多线程-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 · 1811 阅读 · 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 · 1859 阅读 · 1 评论 -
从头认识多线程-1.11 suspend和resume缺点-独占
这一章节我们来讨论一下suspend缺点-独占。1.return的失效package com.ray.deepintothread.ch01.topic_11;public class SuspendMonopolize_1 { @SuppressWarnings("deprecation") public static void main(String[] args) throws In原创 2016-04-17 21:51:38 · 1930 阅读 · 0 评论