线程

JVM初识

瘦欲@ 提交于 2020-03-08 11:28:00
###JVM初体验 基本概念:JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。 JVM大致可分为三部分 1.Java代码的执行 代码执行也可以分为三个过程 代码编译为class,命令javac 转载class,命令ClassLoader 执行class,亦可分为解释执行与编译执行两部分,编译执行可分为client complier与server compiler 2.内存管理 内存管理大致分为四个部分 内存空间:包含方法区、堆,本地方法栈、pc寄存器 内存分配:有堆上分配、TLAB分配、栈上分配 内存回收:1.用到的算法有:Copy、Mark-Sweep、Mark-Compact,2.sun jdk的分代回收可分为:新生代可用的GC、Minor GC触发机制以及日志格式、旧生代可用的GC、Full Gc触发机制以及日志格式 内存状况分析:jconsole、visualvm、jstat、jmap、MAT 3.线程资源同步与交互机制 线程资源同步:可分为线程资源执行机制和线程资源同步机制,线程资源同步机制:Sychronized的实现机制,lock/unlock实现机制 线程交互机制:Object.wait/notify/notifyall

程序、任务、进程和线程的联系与区别

大兔子大兔子 提交于 2020-03-08 10:37:56
概念: 程序(program)只是一组指令的有序集合。 任务(task)是最抽象的,是一个一般性的术语,指由软件完成的一个活动。一个任务既可以是一个进程,也可以是一个线程。简而言之,它指的是一系列共同达到某一目的的操作。例如,读取数据并将数据放入内存中。这个任务可以作为一个进程来实现,也可以作为一个线程(或作为一个中断任务)来实现。   进程(process)常常被定义为程序的执行。可以把一个进程看成是一个独立的程序,在内存中有其完备的数据空间和代码空间。一个进程所拥有的数据和变量只属于它自己。 进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。   在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。   线程(tread)则是某一进程中一路单独运行的程序。也就是说,线程存在于进程之中。一个进程由一个或多个线程构成,各线程共享相同的代码和全局数据,但各有其自己的堆栈

Web Worker的学习

喜你入骨 提交于 2020-03-08 10:22:17
一、引 最近打算弄点面试778,所以开始系统的学习下js的一些知识,把一些还没好好认真看看的知识,都梳理一下吧,有幸能看到这篇文章的问,希望你也可以学的更好,我只是在前端路上一路埋头走下去不准备回头的小菜鸟,让我们开始吧 二、介绍 知道JS的都知道,JS是由于历史的原因导致它是单线程的语言,但是在越来越多的开发中发现,多线程也是有必要的,所以在HTML5的规范中,把多线程的解决方案 Web Worker 写了进来。具体的讲下 Web Worker 的作用,就是为 JS 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给子线程进行后台运行。而主线程在前端运行,两者互不干扰。等到 worker 线程完成计算任务,再把结果 post 给主线程。这样就会有很多好处,比如一些高I/O,或者计算密集型或者高延迟的任务都可以后台运行,而不影响前端UI的运行,各司其职,提高用户的体验 当然在 worker 有这么多好处的同时,也是有一点点的坏处的,上面说了创建的子线程是后台运行的,所以它和主线程是互不影响的,所以对子线程worker的操作只有对其通信,当子线程一创建即会运行,创建了多了也会影响资源的使用,所以当任务结束后,应该手动关闭子线程。 三、限制 它这么好,也是有点限制的。 同源问题,对于处理的脚本都要遵循是同源文件下的脚本。 子线程是和主线程相互独立的

[JUC第一天]浅谈volatile关键字

馋奶兔 提交于 2020-03-08 10:09:38
文章目录 概述 可见性 为什么有时会不可见 如何解决 防止重排序 一个有趣的例子 重排序会导致什么 内存屏障 原子性 什么是原子性 volatile变量不具有原子性 概述 在Java语言规范第三版中, volatile 关键词的定义如下: Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地使用和更新,线程应该确保通过排他锁单独获得这个变量 并发编程中有两个很常见的关键词: synchronized 和 volatile volatile 可以用来修饰一个变量,使得并发情况下所有线程得到这个对象的值都是一样的 相比与 synchronized 操作会找个东西当锁, volatile 则是通过实时共享变量的值的方式来保证变量的可见性的,而并没有锁什么东西,所以说他的使用并不会引起程序的上下文切换,所以也说,volatile是轻量级的synchronized volatile最大的两个特点就是: 使得内存模型中所有线程获取到的值都是统一的(可见性) 避免指令在执行的时候因为优化机制重排序而出错 可见性 内存可见性 :每一个工作线程看到的某个变量的值都是相同的,而且是他最新的状态 为什么有时会不可见 这首先就要从计算机的缓存说起了: 很久以前,计算机的CPU和内存是直接连着的,但是这样导致的是传输速度跟不上CPU的运算速度 后来的计算机中通过设置缓存的方式

多进程多线程简单说明,System V IPC 简介(本机IPC)【linux】(zz)

会有一股神秘感。 提交于 2020-03-08 10:04:16
多进程多线程简单说明 涉及管道通信的多进程和多线程说明 对比多进程和多线程各自使用的场合 线程 进程 System V IPC(本机IPC) 有关System V IPC System V IPC的特点 管道(原始IPC) System V IPC 使用System V IPC时,不存在亲缘进程的说法 System V IPC标识符 怎么才能得到这个“标识符” System V IPC标识符的作用? 多进程多线程简单说明 涉及管道通信的多进程和多线程说明 在使用有名管道实现双向通信时,由于读管道是阻塞读的,为了不让“读操作”阻塞“写操作”,使用了父子进 程来多线操作, 1)父进程这条线:读管道1 2)子进程这条线:写管道2 实际上我们后面在线程以后,凡是涉及到多线操作的,基本都使用多线程来实现 ,比如 1)主线程:读管道1 2)次线程:写管道2 我们这里通过进程间通信的管道方法实现,还会有线程实现的博客说明。 也就是说上面的管道通信, 我们完全可以把父进程改为主线程,把子进程改为次线程 。 对比多进程和多线程各自使用的场合 线程和进程都是并发运行的 ,但是线程和进程各自的使用的场合有所不同。 线程 凡是涉及多线时,我们使用线程来并发实现,比如我们上面实现的“有名管道”双向通信的例子,这个多线操作理论上就应该使用多线程来实现。 因为多线使用线程更省计算机cpu和内存的开销。

iOS多线程之GCD详解

◇◆丶佛笑我妖孽 提交于 2020-03-08 10:02:49
GCD(Grand Central Dispatch)是基于C语言开发的一套多线程开发机制。也是目前苹果官方推荐的多线程开发方法。iOS三种多线程开发中GCD是抽象层次最高的。当然用起来也是最简单的。只是它基于C语言开发。并不像NSOperation是面向对象的开发。而是完全面向过程的。这种机制相比较于前面两种多线程开发方式最明显的优点就是它对于多核运算更佳有效。 GCD中也有一个类似于NSoperationQueue的队列,GCD统一管理整个队列中的任务。但是GCD中的队列氛围并行队列和串行队列两类。   串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行。   并发队列:有多个线程,操作进来之后他会将这些队列安排到可用的处理器上。同时保证先进来的任务优先处理。 其实在GCD中还有一个特殊的队列就是主队列,用来执行主线程上的操作任务。(从前面的演示中可以看到其实在NSOperation中也有一个主队列) 串行队列 使用串行队列时首先要创立一个串行队列,然后调用异步调用方法,在此方法中传入串行队列和线程操作即可自动执行。下面就是一个例子。 #define ROW_COUNT 5 #define COLUMN_COUNT 3 #define ROW_HEIGHT 100 #define ROW_WIDTH ROW_HEIGHT #define CELL_SPACING 10

关于iOS多线程的总结

笑着哭i 提交于 2020-03-08 10:01:16
关于iOS多线程的总结 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案例,在实际使用中感受它们的区别。还有一点需要说明的是,这篇文章将会使用 Swift 和 Objective-c 两种语言讲解,双语幼儿园。OK,let's begin! 概述 这篇文章中,我不会说多线程是什么、线程和进程的区别、多线程有什么用,当然我也不会说什么是串行、什么是并行等问题,这些我们应该都知道的。 在 iOS 中其实目前有 4 套多线程方案,他们分别是: Pthreads NSThread GCD NSOperation & NSOperationQueue 所以接下来,我会一一讲解这些方案的使用方法和一些案例。在将这些内容的时候,我也会顺带说一些多线程周边产品。比如: 线程同步 、 延时执行 、 单例模式 等等。 Pthreads 其实这个方案不用说的,只是拿来充个数,为了让大家了解一下就好了。百度百科里是这么说的: POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。 简单地说,这是一套在很多操作系统上都通用的多线程API,所以移植性很强

iOS RUN LOOP 是个什么东西?

点点圈 提交于 2020-03-08 09:53:39
RUN Loop是什么? 1。 runloop是事件接收和分发机制的一个实现。 2。什么时候使用runloop 当需要和该线程进行交互的时候。主线程默认有runloop。当自己启动一个线程,如果只是用于处理单一的事件,则该线程在执行完之后就退出了。所以当我们需要让该线程即监听某项事务事,就得让线程一直不退出,runloop就是这么一个循环,没有事件的时候,一直卡着,有事件来临了,执行其对应的函数 3。run loop需要处理的event source 有两种:input sources(常是其他线程的异步的event)和 timer sources(定时器)。 Anatomy of a Run Loop run loop,正如其名称所示,是线程进入和被线程用来响应事件以及调用事件处理函数的地方。需要在代码中使用控制语句实现run loop的循环,也就是说,需要代码提供while 或者 for循环来驱动run loop。在这个循环中,使用一个runloop对象[NSRunloop currentRunloop]执行接收消息,调用对应的处理函数。 runloop接收来自两种源事件,input sources和timer sources。前者传递异步事件,通常是来自其他线程和不同的程序中的消息;后者传递同步事件(重复执行或者在特定时间上触发)

iOS多线程开发(三)---Run Loop(二,三)

不羁的心 提交于 2020-03-08 09:53:08
二,何时使用Run Loop 对于辅助线程,在需要和线程有更多交互时,才使用Run Loop。 比如:1)使用端口或者自定义输入源来和其他线程通讯 2)使用线程定时器 3)Cocoa中使用任何performSelector...的方法(参考 Table: Performing selectors on other threads) 4)使线程周期性工作 三,如何使用Run Loop对象 Run Loop对象提供了 添加输入源,定时器和Run Loop的观察者以及启动Run Loop 的接口,使用Run Loop包活获取--配置--启动--退出四个过程 1,获取Run Loop的对象 A,通过NSRunLoop获取 // 获得当前thread的Run loop NSRunLoop *myRunLoop = [NSRunLoop currentRunLoop]; // 将Cocoa的NSRunLoop类型转换程Core Foundation的CFRunLoopRef类型 CFRunLoopRef ç = [myRunLoop getCFRunLoop]; B,使用CFRunLoopGetCurrent()函数 2,配置Run Loop 所谓配置Run Loop主要是给Run Loop添加输入源,定时器或者添加观察者,即设置Run Loop模式。上面函数- (void

Java自学-多线程 原子访问

試著忘記壹切 提交于 2020-03-08 09:48:26
多线程 原子访问 步骤 1 : 原子性操作概念 所谓的 原子性操作 即不可中断的操作,比如赋值操作 int i = 5; 原子性操作本身是线程安全的 但是 i++ 这个行为,事实上是有3个原子性操作组成的。 步骤 1. 取 i 的值 步骤 2. i + 1 步骤 3. 把新的值赋予i 这三个步骤,每一步都是一个原子操作,但是合在一起,就不是原子操作。就 不是线程安全 的。 换句话说,一个线程在步骤1 取i 的值结束后,还没有来得及进行步骤2,另一个线程也可以取 i的值了。 这也是分析同步问题产生的原因 中的原理。 i++ ,i--, i = i+1 这些都是非原子性操作。 只有int i = 1,这个赋值操作是原子性的。 步骤 2 : AtomicInteger JDK6 以后,新增加了一个包 java.util.concurrent.atomic ,里面有各种原子类,比如 AtomicInteger 。 而AtomicInteger提供了各种自增,自减等方法,这些方法都是原子性的。 换句话说,自增方法 incrementAndGet 是线程安全的,同一个时间,只有一个线程可以调用这个方法。 package multiplethread; import java.util.concurrent.atomic.AtomicInteger; public class