多线程

Java_14:多线程高阶

喜夏-厌秋 提交于 2020-03-17 22:28:35
一、多线程 1.为什么使用多线程: (1)安全 (2)效率 2.多线程使用场景: (1)需要执行比较耗时的操作 (2)需要异步处理的业务(比如阻塞) 3.使用多线程要考虑的因素: (1)执行的代码任务量 (2)系统资源 (3)执行任务的数量 二、线程间竞争对象锁的过程 三、synchronized关键字 1.synchronized的作用: 通过线程间的同步互斥达到线程安全的三大特性(原子性、可见性、有序性) 2.synchronized执行效率: (1)如果线程数量越多,性能下降的越快 (2)同步代码执行时间越快。性能相对来说,下降越快 3.synchronized实现原理: monitor机制:monitorenter、monitorexit,计数器 4.synchronized的锁机制: (1)乐观锁: (2)悲观锁: (3)CAS Compare and Swap,比较并交换(原始值、修改值、预期值、版本号)---属于乐观锁 CAS的应用: java.util.concurrent.atomic的实现原理就是CAS 5.synchronized的优化方案: 来源: 51CTO 作者: 小西几 链接: https://blog.51cto.com/14234228/2479527

Java_14:多线程高阶

别来无恙 提交于 2020-03-17 22:27:57
一、多线程 1.为什么使用多线程: (1)安全 (2)效率 2.多线程使用场景: (1)需要执行比较耗时的操作 (2)需要异步处理的业务(比如阻塞) 3.使用多线程要考虑的因素: (1)执行的代码任务量 (2)系统资源 (3)执行任务的数量 二、线程间竞争对象锁的过程 三、synchronized关键字 1.synchronized的作用: 通过线程间的同步互斥达到线程安全的三大特性(原子性、可见性、有序性) 2.synchronized执行效率: (1)如果线程数量越多,性能下降的越快 (2)同步代码执行时间越快。性能相对来说,下降越快 3.synchronized实现原理: monitor机制:monitorenter、monitorexit,计数器 4.synchronized的锁机制: (1)乐观锁: (2)悲观锁: (3)CAS Compare and Swap,比较并交换(原始值、修改值、预期值、版本号)---属于乐观锁 CAS的应用: java.util.concurrent.atomic的实现原理就是CAS 5.synchronized的优化方案: 来源: 51CTO 作者: 小西几 链接: https://blog.51cto.com/14234228/2479528

java用Thread方式创建多线程

ぐ巨炮叔叔 提交于 2020-03-17 18:19:48
进程:一个正在执行的程序,每一个进程都有一个执行顺序,该 顺序是一个执行路径,或者叫一个控制单元。 线程:进程中一个独立的控制单元。线程控制着进程的执行。 一个进程中至少有一个线程。 java VM中至少有一个线程负责java程序的执行。 而且这个线程运行的代码存在于main方法中。该线程为主线程。 扩展,jvm启动了两个线程,一个主线程,一个垃圾回收机制的线程。 1.怎样创建一个多线程? 第一种方法:通过继承Thread类的方法 1.继承Thread类 2.重写Thread类的run()方法 目的:将自定义的代码存储在run()方法中,让线程运行。 3.调用线程的start()方法。 (了解:多核编程,单核cpu的时候多线程的切换由线程控制,多核cpu下 则每个cpu可以同时处理多线程,单个cpu在同一时间只能执行一个线程, 多核下内存是瓶颈) 多线程具有随机性: 因为多线程都获取cpu的执行权。cpu执行到谁,谁就执行。明确一点,在某一时刻 只能有一个程序在运行。(多核除外),cpu在做着快速的切换,以达到看上去是同 事运行的效果。至于每个线程执行多久,cpu说了算,(其实我们可以控制执行时间爱你) 为什么要覆盖run()方法? Thread类用于描述线程。该类定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。 也就是说Thread类中的run(

JavaScript 进阶(一)JS的\"多线程\"

二次信任 提交于 2020-03-17 17:39:38
这个系列的文章名为“JavaScript 进阶”,内容涉及JS中容易忽略但是很有用的,偏JS底层的,以及复杂项目中的JS的实践。主要来源于我几年的开发过程中遇到的问题。小弟第一次写博客,写的不好的地方请诸位斧正,觉得还有一些阅读价值的请帮忙分享下。这个“JavaScript 进阶”是一个系列文章,请大家鼓励鼓励,我尽快更新。另外,如果你有比较好的话题,也可以在下面评论,我们一起研究提高。 JS是多线程的吗? 多线程编程相信大家都很熟悉,比如在界面开发中,如果一个事件的响应需要较长时间,那么一般做法就是把事件处理程序写在另外一个线程中,在处理过程中,在界面上面显示类似进度条的元素。这样界面就不会卡住,并且能够显示任务执行进度。记得刚开始做前端的时候,老板交代在界面上面做一个定时器,每秒更新用户的在线时间。当时拥有Java和C++开发经验的我自信满满的说我加一个线程就可以分分钟搞定了。所以查阅文档,发现setTimeout和setInterval可以很方便的实现该功能。那时候我就认为这就是JS中的多线程。setTimeout相当于启动一个线程,等待一段时间后执行函数,setInterval则是在另外的一个线程中,每隔一段时间执行函数。这个观念在我的头脑中存在了一年左右,直到遇到了这样的一个问题。 测试人员发现一个按钮的点击响应时间较长,在响应过程中,界面卡住了

JAVA中的多线程(一)

馋奶兔 提交于 2020-03-17 17:26:30
进程:是一个正在执行中的程序     每一个进程执行都有一个执行的顺序,该顺序是一个执行路径,或者叫控制单元 线程:就是进程中的一个独立的控制单元     线程在控制着进程的执行 一个进程中至少有一个线程 JAVA VM启动的时候会有一个进程java.exe 该进程中至少有一个线程在负责java程序的执行 而且这个线程运行的代码存在于main方法中 该线程称之为主线程 扩展:更细节说明JVM,JVM的启动不止一个线程,还有负责垃圾回收机制的线程 如何在自定义的代码中,自定义一个线程? 创建线程的第一种方式:   继承Thread,步骤如下     继承Thread类     复写Thread类中的run方法     调用线程的start方法,该方法有两个作用,一个是启动线程,第二个调用run方法 发现运行结果每一次都不同 因为多个线程都获取CPU的执行权,CPU执行到谁,谁就运行 明确一点,在某个时刻,只有一个程序在运行(一个线程),多核除外 CPU做快速的切换,达到看上去是同时运行的结果 我们可以形象把多线程的运行行为看成在互相抢夺CPU的执行权 这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长,CPU说了算 1 class Demo extends Thread 2 { 3 public void run() 4 { 5 for(int x = 0; x<60 ;x+

Java 多线程

╄→гoц情女王★ 提交于 2020-03-17 17:22:46
一、概述 理解多线程先要理解线程,理解线程先要理解进程。 1. 进程 一个正在执行的程序。 每个进程的执行都有一个执行的顺序,顺序是一个执行路径,也叫一个控制单元。 2. 线程 进程中独立的控制单元称为线程。 线程控制进程的执行。 进程中只要有一个线程在执行,进程就不会结束。 一个进程中至少存在一个线程。 3. 多线程 Java 虚拟机启动时,会有一个 java.exe 的执行程序,也就是一个进程。 这个进程中至少存在一个线程负责 java 程序的执行,这个线程的运行代码存在 main 方法中,这个线程称之为主线程。 JVM 启动时除了执行一个主线程,还会启动负责垃圾回收机制的线程。 在一个进程中有多个线程执行的方式,称为多线程。 4. 多线程的意义 多线程能让程序产生同时运行的效果,可以提高程序执行的效率。 例如: java.exe 进程执行主程序时,如果程序的代码非常多,在堆内存中会产生很多对象,而对象调用完后就会变成垃圾。如果垃圾过多的话,可能会导致堆内存出现内存不足的现象,影响程序的运行。这种情况下,如果只有一个线程在运行处理的话,程序执行的效率非常低;如果有多个线程在帮助处理的话,程序执行的效率将大大的提高。 例如:垃圾回收机制的线程在帮助进行垃圾回收的话,那堆内存空间的释放将快很多。 5. CPU 运行的原理 PC 上有很多程序“同时”进行,看起来好像是 CPU “同时

并发编程之Callable和Future接口、FutureTask类

末鹿安然 提交于 2020-03-17 12:29:30
某厂面试归来,发现自己落伍了!>>> Callable接口代表一段可以调用并返回结果的代码;Future接口表示异步任务,是还没有完成的任务给出的未来结果。所以说Callable用于产生结果,Future用于获取结果。 Java 5在concurrency包中引入了java.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一个对象或者抛出一个异常。 其中Runnable可以提交给Thread来包装下,直接启动一个线程来执行,而Callable则一般都是提交给ExecuteService来执行。Executor就是Runnable和Callable的调度容器,Future就是对于具体的调度任务的执行结果进行查看,最为关键的是Future可以检查对应的任务是否已经完成,也可以阻塞在get方法上一直等待任务返回结果。 Runnable和Callable的差别 就是Runnable是没有结果可以返回的,并且Runnable无法抛出返回结果的异常,就算是通过Future也看不到任务调度的结果的。 Callable接口使用泛型去定义它的返回类型。Executors类提供了一些有用的方法在线程池中执行Callable内的任务。由于 Callable任务是并行的(并行就是整体看上去是并行的,其实在某个时间点只有一个线程在执行)

JAVA并发编程-线程间协作(Object监视器方法与Condition)

二次信任 提交于 2020-03-17 11:21:32
某厂面试归来,发现自己落伍了!>>> 原文地址: http://blog.csdn.net/zhshulin/article/details/50762465 下面只是简单的介绍一下,具体代码可以看我分享的代码,注释都有 说到线程间协作,不得不提到经典的 生产者与消费者模型 :有一个商品队列,生产者想队列中添加商品,消费者取出队列中的商品;显然,如果队列为空,消费者应该等待生产者产生商品才能消费;如果队列满了,生产者需要等待消费者消费之后才能生产商品。队列就是这个模型中的临界资源,当队列为空时,而消费者获得了该对象的锁,如果不释放,那么生产者无法获得对象锁,而消费者无法消费对象,就进入了死锁状态;反之队列满时,生产者不释放对象锁也会造成死锁。这是我们不希望看到的,所以就有了线程间协作来解决这个问题。 其实说到生产者与消费者模型,我们不能简单的知道怎么实现,而是需要知这种模型的使用场景:主要是为了复用和解耦, 常见的消息框架(非常经典的一种生产者消费者模型的使用场景) ActiveMQ 。发送端和接收端用Topic进行关联。 JAVA语言中,如何实现线程间协作呢?比较常见的方法就是利用Object.wait(),Object.notify()和Condition。 先看看这几个方法究竟有什么作用?为什么利用它们就可以实现线程间协作了呢? 首先分析一下wait()/notify()

iOS多线程各种安全锁介绍 - 线程同步

*爱你&永不变心* 提交于 2020-03-17 08:58:04
一、atomic介绍 github对应Demo:https://github.com/Master-fd/LockDemo 在iOS中,@property 新增属性时,可以增加atomic选项,atomic会给对应对setter方法加锁,相当于 - (void)setTestStr:(NSString *)testStr { @synchronizad(lock){ if (testStr != _testStr) { [_testStr release]; _testStr = [testStr retain]; } } } 那么就有问题了,为什么atomic又不是线程安全的呢??而且还会代理性能问题,比起nonatomic性能可能要大减20倍,如果频繁的调用,可能更多。 1、当线程A,给TestStr设置值得时候,会调用对应的setter方法,也就是加锁了,此时B线程也要对TestStr进行设置新值,因为A线程已经锁住了,所以B只能等待,这个时候是 线程安全 的。 2、当线程A,给TestStr设置值得时候,此时B线程在读TestStr的值,因为setter和getter方法是没有联系的,这时,A在执行到加锁,只是还没有设置值,然而B线程已经读取走了,本来是想读取A设置之后的值,却读取了设置之前的值, 也就线程不安全 了。 3、当线程A,给TestStr设置值得时候

生产者消费者模型、读者写者模型

耗尽温柔 提交于 2020-03-17 08:22:04
生产者与消费者模型 什么是生产者消费者模型 某个模块负责产生数据,这些数据由另一个模块来负责处理,产生数据的模块,形象地称为生产者,而处理数据的模块,就称为消费者,该模式还需有一个缓冲区处于生产者和消费者之间,作为一个中介,生产者把数据放入缓冲区,而消费者从缓冲区取出数据。在多线程编程中阻塞队列(Blocking Queue)是一种常用于实现生产者和消费者模型的数据结构。其与普通的队列区 别在于:当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存 放元素的操作也会被阻塞,直到有元素被从队列中取出 为什么要使用生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯, 而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生 产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个 阻塞队列就是用来给生产者和消费者解耦的。 生产者与消费者之间的关系 1.三种关系:生产者与生产者(互斥)、消费者与消费者(互斥)、生产者与消费者(互斥、同步) 2.两种角色:生产者 、消费者 3.一种场所:为生产者与消费者提供数据单元的缓冲区 为了方便记忆:321原则 生产者与消费者模型的优点 1、解耦合