线程
文章平均质量分 72
mayifan_blog
湖南大学,电气自动化,自学互联网
展开
-
Java并发包中的锁原理剖析
LockSupport工具类LockSupport是JUC并发包下的一个工具类,它的底层是由Unsafe类实现的,它是基于Unsafe类的park()和unpark()方法包装并扩展功能实现的一个工具类,它主要用于对线程的挂起和唤醒操作,它是线程安全的,底层由CAS算法实现。通过它的名字我们也可以知道,它是锁的支持类,后面的锁的实现都是基于它实现的。LockSupport的park()方法:...原创 2019-02-15 03:15:46 · 604 阅读 · 0 评论 -
Java并发包中并发队列原理剖析
非阻塞队列(ConcurrentLinkedQueue)**介绍:**这是一种无界的非阻塞队列,它的底层数据结构是通过单向链表实现的,只可以在队尾通过CAS算法添加元素,或者是在队尾通过CAS算法移除元素,它是一种线程安全的队列。1.offer操作:offer操作是指通过CAS算法在队列末尾添加元素,checkNotNull(e)方法检测添加的元素是否为空,如果是空则会抛出异常。然后定义一个新...原创 2019-02-20 01:03:50 · 422 阅读 · 0 评论 -
Java并发包中的List源码剖析
CopyOnWriteArrayList(写时复制ArrayList)写时复制:这是JUC并发包下的基于写时复制的ArrayList。为什么是写时复制呢?因为当调用对这个ArrayList中的元素进行修改的方法时,会先复制一个原数组的副本,对这个副本进行操作,最后再让原数组的引用指向这个新的数组,实现数据的更新,这个过程的原子性通过独占锁来保证,这就是写时复制。它归类于并发包的原因是,对这个类的...原创 2019-02-14 00:26:30 · 1048 阅读 · 0 评论 -
Java并发包中原子操作类原理剖析
JUC包中的类是为解决高并发而设计的类,其中包括原子操作类,这些类的底层都是基于Unsafe类的方法实现的,JUC包中的原子操作类包括AtomicInteger、AtomicIong、AtomicBoolean等原子操作类,它们的功能和Integer、Long、Boolean类似,只是这些原子操作类的底层由Unsafe类的方法实现,是原子性操作,满足高并发的要求,在多线程下,使用这些原子操作类会比较可靠。这些原子操作类通过CAS实现在高并发下代替synchronize实现更高的效率,下面我们来具体地分析原创 2019-02-09 18:34:38 · 420 阅读 · 0 评论 -
线程同步之可重入锁
可重入锁与不可重入锁的比较可重入锁是指当前已经获得锁的线程可以再次获取该锁且不会陷入阻塞。这句话似乎不是很好理解,我们可以从理解不可重入锁的概念来理解。不可重入锁是指在一个线程调用某方法获取锁对象之后,其他线程再次请求获取该锁,都会陷入等待,直到当前线程释放锁之后,其他对象才有机会获得锁,并且在这期间,如果已经获得锁的线程再次执行获得锁的方法,也会使得自己被阻塞,同时释放持有的锁资源。可重入锁和...原创 2018-12-31 14:08:27 · 969 阅读 · 0 评论 -
如何正确地结束一个线程
为什么不用stop()方法一般来说,当一个线程的方法体执行完,这个方法就会结束了。我们一般不直接使用stop方法来终止线程,这可能会导致业务逻辑不完整或者破坏原子性的操作,一段代码可能用来输出某些重要的信息,在方法的执行中使用stop方法终止线程,会使得输出的信息破坏或者不完整;在原子操作比如重入锁的使用时,当一个线程对象多次获得锁会使得计数加一,接下来需要以相同的次数释放锁,别的线程才能获得锁...原创 2019-01-02 00:19:25 · 14071 阅读 · 1 评论 -
Runnable和Thread源码分析
Runnable和Thread源码分析问题的引入:Runnable是一个接口,它只有一个run()抽象方法,run()抽象方法需要被实现后才能使用。Thread类继承了Runnable接口,并且Thread中实现了run()方法。最后,通过Thread类的start()方法就可以启动线程了。这是我们平时在应用中使用线程的常用方法。如果多加思考你会发现以下几个问题:1、为什么调用start()...原创 2019-01-04 21:35:51 · 1675 阅读 · 4 评论 -
线程同步中wait()和notify()的使用(用生产者消费者模式解释)
wait()和notify()是什么虽然我们一般在多线程中使用wait和notify的方法,但其实它们是不属于Thread类的,他们是Object类中的方法,我们先来看一下API中的解释:1、notify():唤醒在此对象监视器上等待的单个线程。2、notifyAll():唤醒在此对象监视器上等待的所有线程。3、wait():在其他线程调用此对象的 notify() 方法或 notifyA...原创 2018-11-16 14:21:40 · 566 阅读 · 0 评论 -
哲学家就餐问题解决方案(java)
什么是哲学家就餐问题哲学家就餐问题是计算机科学中的一个经典问题,用于演示在并行计算中多线程同步时产生的问题。题目要求是:五位哲学家围着一张桌子而坐,他们不交谈,每人面前放了一碗饭,每两个人之间放了一只筷子(总共五只筷子)。哲学家只能做两件事,吃饭和思考,吃饭的时候不思考,思考的时候不吃饭。哲学家只有拿起自己身边的两只筷子才能吃饭,拿筷子的顺序是先拿左手再拿右手(不同时)。题目分析因为哲学家之...原创 2018-11-16 21:49:07 · 5034 阅读 · 3 评论 -
线程与多线程
什么是线程线程是程序执行流的最小单元,也是进程运行中的一个实体,它是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。...原创 2018-11-11 14:37:48 · 136 阅读 · 0 评论 -
Java Unsafe类的使用
Unsafe类的作用Unsafe类是rt.jar包中的类,它提供了原子级别的操作,它的方法都是native方法,通过JNI访问本地的C++库。它的出现是为了解决在高并发下的数据同步问题。synchronize关键字修饰的代码块被加了独占锁,相同时间只能有一个线程访问其中的内容,在高并发下这必然会导致大量线程挂起,从用户态转为内核态,带来很大的消耗而且操作效率低下。CAS算法的出现使得在不使用sy...原创 2019-02-09 11:04:20 · 3391 阅读 · 0 评论 -
MESI协议和Volatile关键字(解决多线程下变量更新不同步问题)
多线程下变量更新不同步问题测试一个通过修改while循环中标志位来结束一个线程的方法。使while循环中的内容为空,启动线程,线程死循环。当我们在主线程里把标志位flag置为false时,发现线程没有结束(即循环没有退出)。代码如下:public class Test { boolean flag=true; public static void main(Strin...原创 2019-01-01 16:36:14 · 1555 阅读 · 0 评论