![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA多线程
文章平均质量分 96
dagai888
这个作者很懒,什么都没留下…
展开
-
【JAVA多线程13】线程基本方法-线程让步(yield)
Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程。(可能没有效果)yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会。因此,使用yield()的目的是让具有相同优先级的线程之间能够适当的轮换执行。但是,实际中无法保证yield()达到让步的目的,因为,让步的线程可能被线程调度程序再次选中。结论:大多数情况下,yiel...原创 2019-06-12 23:43:55 · 280 阅读 · 0 评论 -
【JAVA多线程14】线程基本方法-线程中断(interrupt)
Java多线程的中断机制,网上的帖子说得很浅,并没深究其原理。看了Java源码,对Java的中断机制有了略深入的理解,在这篇文章中向感兴趣的网友分享下。这篇文章主要通过一个典型例子对中断机制进行剖析。 一:一些概念和重要方法 interrupt status(中断状态):请记住这个术语,中断机制就是围绕着这个字段来工作的。在Java源码中代表中断状态的字段是:private volat...原创 2019-06-12 23:55:30 · 180 阅读 · 0 评论 -
【JAVA多线程15】线程基本方法-join
Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。例如:Thread t = new MyThread();t.start();t.join();//等线程t执行完毕之后,才能执行其他线程另外,join()方法还有带超时限制的重载版本。 例如t.join(5000);则让线程等待...原创 2019-06-13 00:17:49 · 154 阅读 · 0 评论 -
【JAVA多线程16】线程上下文切换
并发编程的目的是为了让程序运行得更快,但是并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制问题,本文要研究的是上下文切换的问题。什么是上下文切换即使是单核CPU也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间...原创 2019-06-13 00:22:43 · 649 阅读 · 0 评论 -
【JAVA多线程17】多线程中的锁
多个线程同时对同一个对象进行读写操作,很容易会出现一些难以预料的问题。所以很多时候我们需要给代码块加锁,同一时刻只允许一个线程对某个对象进行操作。多线程之所以会容易引发一些难以发现的bug,很多时候是写代码的程序员对线程锁不熟悉或者干脆就没有在必要的地方给线程加锁导致的。这里我想总结一下java多线程中的各种锁的作用和用法,还有容易踩的坑。这篇文章里面有很多的文字和代码都来自于《实战Java高...原创 2019-06-13 00:25:39 · 187 阅读 · 0 评论 -
【JAVA多线程18】线程池原理和锁
1 线程池1.1 好处1.2 作用1.3 线程池创建方式1.4 原理分析1.5 线程池合理配置2 锁的深度化2.1悲观锁2.2 乐观锁2.3 重入锁2.4 读写锁2.5 CAS无锁机制2.6 自旋锁2.7 分布式锁1 线程池1.1 好处1)降低资源消耗,重复利用已经创建好的线程,降低线程创建和销毁造成的消耗2)提高响应速度,当任...原创 2019-06-13 00:35:06 · 326 阅读 · 0 评论 -
【JAVA多线程19】JAVA 阻塞队列原理
今天我们来讨论另外一类容器:阻塞队列。 非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。但是有了阻塞队列就不一样了,它会对当前线程产生...原创 2019-06-13 00:39:08 · 1928 阅读 · 1 评论 -
【JAVA多线程20】CyclicBarrier
CyclicBarrier是另外一种多线程并发控制实用工具,和CountDownLatch非常相似,比CountDownLatch更复杂且强大。构造方法//parties表示屏障拦截的线程数量,当屏障撤销时,先执行barrierAction,然后在释放所有线程 public CyclicBarrier(int parties, Runnable barrierAction) //bar...原创 2019-06-13 00:42:48 · 72 阅读 · 0 评论 -
【JAVA多线程21】CountDownLatch
前序:上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现。经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消除bug。什么时候用?多线程是在很多地方都会用到的,但是我们如果想要实现在某个特定的线程运行完之后,再启动另外一个线程呢,这个时候CountDownLatch就可以派上用场了怎么用?...原创 2019-06-13 00:48:15 · 134 阅读 · 0 评论 -
【JAVA多线程22】volatile 关键字
Java线程:volatile关键字Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。谈及到volatile关键字,不得不提的一篇文章是:《Java 理论与实践: 正确使用 Volatile 变量》,这篇...原创 2019-06-13 00:50:24 · 66 阅读 · 0 评论 -
【JAVA多线程23】ThreadLocal
目录导航0、概述 1、ThreadLocal 源码分析 2、ThreadLocalMap 源码分析 3、总结0、概述 ThreadLocal,即线程本地变量。它是将变量绑定到特定的线程上的“入口“,使每个线程都拥有改变量的一个拷贝,各线程相同变量间互不影响,是实现共享资源的轻量级同步。 下面是个ThreadLocal使用的实例,两个任务共享同一个变量,并且两个任务都把该...原创 2019-06-13 00:51:28 · 92 阅读 · 0 评论 -
【JAVA多线程12】线程基本方法-线程睡眠(sleep)
Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率。这里要明确的一点,不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制。线程休眠的目的是使线程让出CPU的最简单的做法之一,线程休眠时候,会将CPU资源交给其他线程,以便能轮换执行,当休眠一定时间后,线程会苏醒,进入准备状态等待执行。线程休眠的方法是Thread.sl...原创 2019-06-12 23:41:36 · 856 阅读 · 0 评论 -
【JAVA多线程11】线程基本方法-线程等待(wait)/线程唤醒(notify)
1、wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。2、wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。3、 由于 wait()、notify/notifyAll() 在syn...原创 2019-06-12 23:06:53 · 1389 阅读 · 0 评论 -
非阻塞算法简介
在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情。Java 语言中主要的同步手段就是synchronized关键字(也称为内在锁),它强制实行互斥,确保执行synchronized块的线程的动作,能够被后来执行受相同锁保护的synchronized块的其他线程看到。在使用得当的时候,内在锁可以让程序做到线程安全,但是在使用锁定保护短的代码路...原创 2019-06-28 14:05:32 · 245 阅读 · 0 评论 -
流行的原子
十五年前,多处理器系统是高度专用系统,要花费数十万美元(大多数具有两个到四个处理器)。现在,多处理器系统很便宜,而且数量很多,几乎每个主要微处理器都内置了多处理支持,其中许多系统支持数十个或数百个处理器。要使用多处理器系统的功能,通常需要使用多线程构造应用程序。但是正如任何编写并发应用程序的人可以告诉你的那样,要获得好的硬件利用率,只是简单地在多个线程中分割工作是不够的,还必须确保线程确实大部...原创 2019-06-28 14:05:09 · 216 阅读 · 0 评论 -
【JAVA多线程01】JAVA线程实现/创建方式
java中创建线程的三种方法以及区别Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用三种方式来创建线程,如下所示:1)继承Thread类创建线程2)实现Runnable接口创建线程3)使用Callable和Future创建线程下面让我们分别来看看这三种创建线程的方法。------------------------...原创 2019-06-10 00:06:59 · 105 阅读 · 0 评论 -
【JAVA多线程02】JAVA线程池
什么是线程池?顾名思义线程池就是线程的容器举个例子:在没有共享电源的年代,车站有5个人手机都没电且都没有带电源,这五个人想要给手机充电只能去车站的售货亭各花100块钱买一个移动电源;但是现在共享电源出现了,假设车站现在一共有3个共享移动电源,那么其中三个人只需要花一块钱租共享移动电源充电,后面2个人等前面的人用完了,接着花1块钱租就可以了(这个例子的前提是这5个人都不赶时间的前提下)这...原创 2019-06-10 00:29:39 · 75 阅读 · 0 评论 -
【JAVA多线程03】线程的生命周期
Java多线程-线程的生命周期线程可以分为4个状态:New(新生),Runnable(可运行):为了方便分析,还可将其分为:Runnable(就绪状态)与Running(运行状态)。blocked(被阻塞),Dead(死亡)。与人有生老病死一样,线程也同样要经历开始(等待)、运行、挂起和停止四种不同的状态。这四种状态都可以通过Thread类中的方法进行控制。下面给出了Thread类...原创 2019-06-10 00:40:20 · 85 阅读 · 0 评论 -
【JAVA多线程04】sleep与wait区别
一sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep 不会释放对象锁。由于没有释放对象锁,所以不能调用里面的同步方法。sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会;sleep()是T...原创 2019-06-10 00:52:00 · 401 阅读 · 1 评论 -
【JAVA多线程05】Java多线程中悲观锁与乐观锁
一:悲观锁 悲观锁,就是不管是否发生多线程冲突,只要存在这种可能,就每次访问都加锁,加锁就会导致锁之间的争夺,有争夺就会有输赢,输者等待。 syncrhoized是一种独占锁,即:占用该锁的线程才可以执行,申请该锁的线程就只能挂起等待,直到占用锁的线程释放锁才唤醒,拿到锁并执行。由于在进程挂起和恢复执行过程中存在着很大的开销,并且当一个线程正在等待锁时,它不能做任何事。...原创 2019-06-10 00:56:04 · 110 阅读 · 0 评论 -
【JAVA多线程06】Synchronized
Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:1、普通同步方法,锁是当前实例对象 1 2 3 4...原创 2019-06-10 01:02:28 · 109 阅读 · 0 评论 -
【JAVA多线程07】ReentrantLock重入锁
采用synchronized进行加锁,是由jvm内部实现的 称为:内置锁。从java1.5开始,jdk api引入了新锁API他们都继承自Lock,称为:显式锁,比如今天的主题ReentrantLock。之所以称做显式锁,主要有两点原因:1、相对于内置锁是有jvm内部实现的,显式锁是在使用java api实现的,确切的说是基于AQS实现的(对AQS的理解后面会写文章分析);2、使用L...原创 2019-06-10 01:07:50 · 117 阅读 · 0 评论 -
【JAVA多线程08】多线程AQS
一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是本文的目录大...原创 2019-06-10 01:16:45 · 98 阅读 · 0 评论 -
【JAVA多线程09】多线程Semaphore信号量
java Semaphore 信号量的使用:在java中,提供了信号量Semaphore的支持。Semaphore类是一个计数信号量,必须由获取它的线程释放,通常用于限制可以访问某些资源(物理或逻辑的)线程数目。一个信号量有且仅有3种操作,且它们全部是原子的:初始化、增加和减少增加可以为一个进程解除阻塞;减少可以让一个进程进入阻塞。信号量维护一个许...原创 2019-06-10 22:58:34 · 350 阅读 · 0 评论 -
【JAVA多线程10】ReadWriteLock读写锁
说到Java并发编程,很多开发第一个想到同时也是经常常用的肯定是Synchronized,但是这里提出一个问题,Synchronized存在明显的一个性能问题就是读与读之间互斥,简言之就是,我们编程想要实现的最好效果是,可以做到读和读互不影响,读和写互斥,写和写互斥,提高读写的效率,如何实现呢?Java并发包中ReadWriteLock是一个接口,主要有两个方法,如下:public...原创 2019-06-12 22:45:29 · 99 阅读 · 0 评论