随笔分类 - 并发
摘要:一 .概述 在前面,我们说到了volatile关键词可以保证可见性和有序性,本节,首先展示一个例子. 我们在上面的例子之中,创建两个线程,使用一个标记位来终结一个线程的执行,但是当我们运行的时候,我们发现我们根本就不能终结这个线程的执行, 原因,在上面我们已经分析过了,就是可见性的问题. flag
阅读全文
摘要:一 . 概述 在之前,我们使用synchronized关键词解决了原子性的操作,本节我们分析一个JVM内存模型导致的另外的两个问题. 二 . 可见性 为了加速线程的运行的速度,JVM的内存模型中设置了线程栈中的缓存,当一个线程使用了堆内存的数据的时候,首先会将这个数据缓存到线程栈之中, 当这个数据是
阅读全文
摘要:一 .概述 当我们实现了原子性操作的时候,我们又会遇到一个问题,那就是线程之间通信的问题.所谓的线程通信,指的就是线程间的执行顺序是需要进行一定的控制的. 我们拿最经典的生产者和消费者模型进行说明: 在这里,我们使用wait()和notify()方法进行实现. 但是我们发现了一个问题,如果我们实现线
阅读全文
摘要:一 .概述 在前面,我们说到了java提供了synchronized关键词帮助我们实现一个可重入的独占锁的概念. 本节,我们讨论这个关键词的使用. 二 .使用方式 synchronized关键词可以出现在三个地方 [1]静态方法上 [2]实例方法上 [3]同步代码块上 从本质上说,我们其实没有必要分
阅读全文
摘要:一 .概述 线程依赖于进程分配资源,因此线程对变量的操作就变得更加的简单,我们可能会使用不同的线程对同一个变量进行操作,这就可能代理线程的安全性问题. 线程的安全性问题归根结底就是正确性问题,如果我们无法对变量进行原子性操作,那么变量就可能出现不一致的状态,因此我们的程序的结果就会出现问题. 在ja
阅读全文
摘要:一 .概述 在前面,我们重点说明了几个Thread的API,本节我们将一些需要注意的APi进行一下分析. 二 .sleep()方法 该方法会让线程进行睡眠,当时间片过去之后,线程就会进入到runnable状态. 当然,这个方法是可以被打断的. 下面演示一下这个方法: 上面的例子之中,我们让线程睡眠了
阅读全文
摘要:一 .概述 join()方法可以让一个线程等待另外一个线程运行结束,同时join()方法具有可打断性,也就是说,在一定的时间点,线程可以不再等待继续执行. 下面我们首先看一下这个例子. 我们发现,执行的结果表明,主线程是在子线程完全执行完毕才会执行的. 通过这个例子,我们可以知道,主线程是会等到子线
阅读全文
摘要:一. 概述 当一个线程启动之后,我们如何终结一个线程呢? 在Thread之中原先的stop()等方法都被废除掉了,那现在我们可以利用的就是线程中断的概念. 我们需要理解的就是,线程中断实际上是我们控制线程终结的一个方式. 二 .线程终结的方法 线程的实例方法,我们获取线程的实例引用之后,可以调用该方
阅读全文
摘要:一 . 概述 一个线程可以具有很多的属性.如,名字,优先级,是否后台线程. 二 . 线程的名字 这个十分好理解,就是在创建线程之后给一个线程指定一个名字. 我们给一个线程分配名字的常用方式有两个: [1]在Thread的构造函数之中给出线程的名字 [2]调用线程实例的setName()方法给线程一个
阅读全文
摘要:一 . 概述 线程的创建由两种方式,其实本质上讲仅仅有一种.(在JUC包出现之后,出现了Callable等接口,但是本质上还是仅仅只有一种方式,只是表示的方式不同而已). [1]继承Thread,重写run()方法. [2]实现Runnable接口,重写run()方法. 我们其实可以将实现Runna
阅读全文
摘要:一 . 概述 线程的整个生命周期是在不断切换其状态的. 在jdk中的Thread类之中有一个枚举类,在这个枚举类之中定义了线程的所有状态. 二 .线程的状态 上面的所有状态里面在加上一running状态总共有7个状态. [1]new状态: 当一个线程创建之后就处于new状态. [2]runnable
阅读全文