线程

Android HandlerThread 的使用及其Demo

ぃ、小莉子 提交于 2020-03-18 14:06:32
今天我们一起来学习下一个Android中比较简单的类 HandlerThread ,虽然它的初始化有点小麻烦。 介绍 首先我们来看看为什么我们要使用 HandlerThread ?在我们的应用程序当中为了实现同时完成多个任务,所以我们会在应用程序当中创建多个线程。为了让多个线程之间能够方便的通信,我们会使用 Handler 实现线程间的通信。 下面我们看看如何在线程当中实例化 Handler 。在线程中实例化 Handler 我们需要保证线程当中包含Looper( 注意 : UI-Thread默认包含Looper )。 为线程创建Looper的方法如下:在线程run()方法当中先调用Looper.prepare()初始化Looper,然后再run()方法最后调用Looper.loop(),这样我们就在该线程当中创建好Looper。( 注意 : Looper.loop()方法默认是死循环 ) 我们实现Looper有没有更加简单的方法呢?当然有,这就是我们的 HandlerThread 。我们来看下 Android 对 HandlerThread 的描述: Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note

因为我说:volatile 是轻量级的 synchronized,面试官让我回去等通知!

倾然丶 夕夏残阳落幕 提交于 2020-03-18 13:27:45
volatile 是并发编程的重要组成部分,也是面试常被问到的问题之一。不要向小强那样,因为一句:volatile 是轻量级的 synchronized,而与期望已久的大厂失之交臂。 volatile 有两大特性:保证内存的可见性和禁止指令重排序。那什么是可见性和指令重排呢?接下来我们一起来看。 内存可见性 要了解内存可见性先要从 Java 内存模型(JMM)说起,在 Java 中所有的共享变量都在主内存中,每个线程都有自己的工作内存,为了提高线程的运行速度,每个线程的工作内存都会把主内存中的共享变量拷贝一份进行缓存,以此来提高运行效率,内存布局如下图所示: 但这样就会产生一个新的问题,如果某个线程修改了共享变量的值,其他线程不知道此值被修改了,就会发生两个线程值不一致的情况,我们用代码来演示一下这个问题。 public class VolatileExample { // 可见性参数 private static boolean flag = false; public static void main(String[] args) { new Thread(() -> { try { // 暂停 0.5s 执行 Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } flag =

MySQL 5.7 深度解析: 半同步复制技术

不问归期 提交于 2020-03-18 07:52:56
复制架构衍生史 在谈这个特性之前,我们先来看看MySQL的复制架构衍生史。 MySQL的复制分为四种: 普通的replication,异步同步。 搭建简单,使用非常广泛,从mysql诞生之初,就产生了这种架构,性能非常好,可谓非常成熟。 但是这种架构数据是异步的,所以有丢失数据库的风险。 semi-sync replication,半同步。性能,功能都介于异步和全同步中间。从mysql5.5开始诞生,目的是为了折中上述两种架构的性能以及优缺点。 sync replication,全同步。目前官方5.7基于Group replication的全同步技术处在labs版本,离正式集成已经不远。全同步技术带来了更多的数据一致性保障。相信是未来同步技术一个重要方向,值得期待。 mysql cluster。 基于NDB引擎,搭建也简单,本身也比较稳定,是mysql里面对数据保护最靠谱的架构,也是目前唯一一个数据完全同步的架构,数据零丢失。不过对业务比较挑剔,限制也较多。 半同步复制 我们今天谈论第二种架构。我们知道,普通的replication,即mysql的异步复制,依靠mysql二进制日志也即binary log进行数据复制。比如两台机器,一台主机(master),另外一台是从机(slave)。 正常的复制为:事务一(t1)写入binlog buffer;dumper

死磕 java线程系列之线程模型

北慕城南 提交于 2020-03-18 07:24:11
问题 (1)线程类型有哪些? (2)线程模型有哪些? (3)各语言使用的是哪种线程模型? 简介 在Java中,我们平时所说的并发编程、多线程、共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫作“ 用户线程 ”,而对应到操作系统,还有另外一种线程叫作“ 内核线程 ”。 用户线程位于内核之上,它的管理无需内核支持;而内核线程由操作系统来直接支持与管理。几乎所有的现代操作系统,包括 Windows、Linux、Mac OS X 和 Solaris,都支持内核线程。 最终,用户线程和内核线程之间必然存在某种关系,本章我们一起来学习下建立这种关系常见的三种方法:多对一模型、一对一模型和多对多模型。 多对一模型 多对一线程模型,又叫作用户级线程模型,即多个用户线程对应到同一个内核线程上,线程的创建、调度、同步的所有细节全部由进程的用户空间线程库来处理。 优点: 用户线程的很多操作对内核来说都是透明的,不需要用户态和内核态的频繁切换,使线程的创建、调度、同步等非常快; 缺点: 由于多个用户线程对应到同一个内核线程,如果其中一个用户线程阻塞,那么该其他用户线程也无法执行; 内核并不知道用户态有哪些线程,无法像内核线程一样实现较完整的调度、优先级等; 许多语言实现的协程库基本上都属于这种方式,比如python的gevent。 一对一模型 一对一模型,又叫作内核级线程模型

进程-----线程

我的梦境 提交于 2020-03-18 06:01:29
一直来对进程,线程糊里糊涂,今天总结下: from TIPI 进程 进程是什么?进程是正在执行的程序;进程是正在计算机上执行的程序实例;进程是能分配给处理器并由处理器执行的实体。进程一般会包括指令集和系统资源集,这里的指令集是指程序代码,这里的系统资源集是指I/O、CPU、内存等。综合起来,我们也可以理解进程是具有一定独立功能的程序在关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。 在进程执行时,进程都可以被唯一的表示,由以下一些元素组成: 进程描述符:进程的唯一标识符,用来和其它进程区分。在Linux中叫进程ID,在系统调用fork期间生成,只是我们通过getpid返回的不是其pid字段,而是其线程组号tgid。 进程状态:我们常说的挂起、运行等状态,其表示的是当前的状态。 优先级:进程间的执行调度相关,相对于其它进程而言。 程序计数器:程序中即将被执行的下一条指令的地址,该地址是内核术中或用户内存空间中的内存地址。 内存指针:包括程序代码和进程相关数据的指针,还有和其它进程共享内存块的指针。 上下文数据:进程执行时处理器的寄存器的数据。 I/O状态信息:包括显式的I/O请求、分配给进程的I/O设备等 记账信息:可能包括处理器时间总和、使用的时钟数总和、时间限制等 以上的这些元素都会放在一个叫做进程控制块的数据结构中

JVM 系列(二)内存模型

别说谁变了你拦得住时间么 提交于 2020-03-18 03:52:30
02 JVM 系列(二)内存模型 一、JVM 内存组成 (1) PC 寄存器(线程私有) Java 虚拟机会为每个线程创建 PC 寄存器,在任意时刻,一个 java 线程总是在执行一个方法,这个方法被称为当前方法。 如果当前方法不是本地方法,PC 寄存器就会执行当前正在被执行的指令,如果是本地方法,则 PC 寄存器值为 undefined,寄存器存放如当前执行环境指针、程序计数器、操作栈指针、计算的变量指针等信息。 这个内存区域是唯一一个在虚拟机中没有规定任何 OutOfMemoryError 情况的区域。 (2) Java 虚拟机栈(线程私有) 每个方法在执行的时候会创建一个栈帧,存储了局部变量表,操作数栈,动态连接,方法返回地址等。每个方法从调用到执行完毕,对应一个栈帧在虚拟机栈中的入栈和出栈。通常所说的栈,一般是指虚拟机栈中的局部变量表部分。局部变量表所需的内存在编译期间完成分配。 如果线程请求的栈深度大于虚拟机所允许的深度,则 StackOverflowError。如果虚拟机栈可以动态扩展,扩展到无法申请足够的内存,则 OutOfMemoryError。 (3) 本地方法栈(线程私有) 本地方法栈和 Java 栈非常类似,最大不同为本地方法栈用于本地方法调用。Java 虚拟机允许 Java 直接调用本地方法(通常使用C编写)。 也会抛出 StackOverflowError

JVM 系列(二)内存模型

半城伤御伤魂 提交于 2020-03-18 03:49:57
02 JVM 系列(二)内存模型 一、JVM 内存区域 JVM 会将 Java 进程所管理的内存划分为若干不同的数据区域。这些区域有各自的用途、创建/销毁时间: 一、 线程私有区域 线程私有数据区域生命周期与线程相同,依赖用户线程的启动/结束而创建/销毁(在 Hotspot VM 内,每个线程都与操作系统的本地线程直接映射,因此这部分内存区域的存/否跟随本地线程的生/死)。 (1) Program Counter Register(程序计数器) Java 虚拟机会为每个线程创建 PC 寄存器,在任意时刻,一个 java 线程总是在执行一个方法,这个方法被称为当前方法。 如果当前方法不是本地方法,PC 寄存器就会执行当前正在被执行的指令,如果是本地方法,则 PC 寄存器值为 undefined,寄存器存放如当前执行环境指针、程序计数器、操作栈指针、计算的变量指针等信息。 这个内存区域是唯一一个在虚拟机中没有规定任何 OutOfMemoryError 情况的区域。 (2) Java Stack(虚拟机栈) 虚拟机栈描述的是 Java 方法执行的内存模型 :每个方法被执行时会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法被调用至返回的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程(VM 提供了 -Xss 来指定线程的最大栈空间

操作系统之-进程

我的未来我决定 提交于 2020-03-17 23:03:24
一、进程    1.1 进程的含义   广义的说,进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。    1.2 进程的状态   三态模型:等待态、就绪态、运行态。(五态模型比三态模型多了新建态和终止态)。--从名字可以推断各种状态的形态。    1.3 进程的特征   进程的特征有四点:动态性、并发性、独立性、异步性。   动态性--进程的实质是程序在多道程序系统中的一次执行过程,既然是过程就要有始有终,所以进程会产生、会消亡。进程执行完毕后,一般不会留下关于它运行的一丝痕迹。   并发性--任何进程都可以与其他进程一起并发执行,并发是任意时刻只有一个程序在运行(要与并行区别)。   独立性--进程是一个独立运行的基本单位,同时也是系统分配资源和调度的基本单位。   异步性--由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。    1.4 进程的调度   进程的调度分为抢占式和非抢占式。   抢占式调度:抢过来自己占用。   无论是抢占式还是非抢占式,都要依照这个队列中任务的先后顺序来运行他们。所以,队列代表着任务的“生存周期”。只要任务还在队列中,任务就没有“死”,即没有运行结束而消亡;任务就没有“生”,即任务还未开始运行。   现在,重点就是如何安排这个队列(五种调度算法)。   以队列为基础

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