线程

Unity C#笔记 协程详解(转)

ε祈祈猫儿з 提交于 2020-03-08 13:00:47
目录 什么是协程 多线程 协程 协程的使用场景 协程使用示例 Invoke的缺陷 协程语法 开启协程 终止协程 挂起 协程的执行原理 什么是协程 在Unity中,协程(Coroutines)的形式是我最喜欢的功能之一,我都会使用它来控制需要定时的。 协同程序,在主程序运行的同时,开启另外一段逻辑处理,来协同当前程序的执行。 可能看了这段文字介绍还是有点模糊,其实可以用多线程来比较。 多线程 多线程,顾名思义,多条同时执行的线程。 最初,多线程的诞生是为了解决IO阻塞问题,如今多线程可以解决许多同样需要异步方法的问题(例如网络等)。 所谓异步,通俗点讲,就是我走我的线程,你走你的线程。当某个线程阻塞时,另一个线程不会受影响继续执行。 需要认识到的是,多线程并不是真正意义上的多条线程同时执行。 它的实际是将一个时间段分成若干个时间片,每个线程轮流运行一个时间片。 (如图,将执行步骤切分成极小的粒度,然后依次运行) 但是由于时间片粒度非常非常小,几乎看不出区别,所以程序执行效果跟真正意义上的并行执行效果基本一致。 多线程的缺陷 然而多线程有一个坏处,就是可能造成共享数据的冲突。 假如有一个变量i = 0, Step1_1的操作是进行++i操作,Step2_1的操作是进行--i操作。 我们预期最终结果i为0。 但由于操作切分得过小,可能会发生这样顺序的事: 线程1:访问i, 将0存到寄存器

JVM学习笔记二:垃圾收集算法

心已入冬 提交于 2020-03-08 12:59:56
垃圾回收要解决的问题: 哪些内存需要回收? 线程私有区域不需要回收,如PC、Stack、Native Stack;Java 堆和方法区需要 什么时候回收? 以后的文章解答 如何回收? 首先进行对象存活性的分析,然后利用GC回收算法进行回收,具体算法请看下文。 如何判断对象是否可以回收? 有两种方式:引用计数算法和可达性分析算法,目前主流商业JVM普遍采用可达性分析算法 引用计数算法 引用计数算法顾名思义,为对象的引用计数,每当有一地方引用它时,计数器加1,引用失效(离开作用域时)减1,当计数器值为0时,对象就可以被回收了。引用计数算法优点是判定效率高,缺点是无法解决对象互相引用的问题,使用此技术进行内存管理的技术有微软的COM、Flash、Python等 可达性分析算法 可达性分析算法,基本思路是以GC Roots为根、向下搜索,所走过的路径成为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链可达时,就成为此对象不可用,即可以被回收。注意再注意:该算法的本质是通过找出所有活对象来把其余空间认定为“无用”,而不是找出所有死掉的对象并回收它们占用的空间。分代式GC是一种部分收集(partial collection)的做法。在执行部分收集时,从GC堆的非收集部分指向收集部分的引用,也必须作为GC roots的一部分。具体到分两代的分代式GC来说

Java中堆内存和栈内存详解

删除回忆录丶 提交于 2020-03-08 12:59:23
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。 堆内存用于存放由new创建的对象和数组 。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放, 数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因, 实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针! java中内存分配策略及堆和栈的比较    1 内存分配策略  

Java中堆内存和栈内存详解

ぐ巨炮叔叔 提交于 2020-03-08 12:58:49
  Java把内存分成两种,一种叫做栈内存,一种叫做堆内存。   在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。 当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。   堆内存用于存放由new创建的对象和数组。 在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。    引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放 。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放, 数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉 。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针! java中内存分配策略及堆和栈的比较    1

JAVA并发编程的学习之路

让人想犯罪 __ 提交于 2020-03-08 12:57:07
一Java内存模型 1 Java内存模型(JMM):为了屏蔽各种硬件和操作系统的内存访问差异, 以实现java程序在任何平台下有相同的并发效果,Java虚拟机规范中定义了java内存模型。 它规范了java虚拟机与计算机内存是如何协调工作的 ,规定了一个线程何时可以看到被其它线程修改过的共享变量的值,以及如何在必须时同步的访问共享变量。 2 同步8种操作:lock、unlock、read、load、use、assign、store、write lock:作用与主内存的变量,把变量设成一个线程独占的状态 unlock:作用与主内存的变量,把锁定的线程释放 read:作用与主内存的变量,把一个变量的值,输送到工作内存中 load:作用与工作内存的变量,把read从主内存读入的变量放入工作内存的副本中 use:作用与工作内存的变量,把工作内存中变量的值传给执行引擎,每当虚拟机遇到一个需要用到这个值的字节码指令时执行的操作 assign(赋值):作用与工作内存的变量, 把一个从执行引擎获取到的值赋给工作变量,每当虚拟机遇到一个需要赋值的字节码指令时执行的操作 store:作用与工作内存的变量,把工作内存中的变量值传入到主内存 write:作用与主内存的变量,把store传入过来的变量存入主内存 二线程安全性 1 线程安全性:当多个线程访问某个类时,不管这些线程采用何种调度方式

进程和线程

假装没事ソ 提交于 2020-03-08 12:54:58
进程 #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main() { puts("Begin"); int pid = fork(); if(pid==0) { puts("Child"); }else { puts("Parent"); } puts("End"); } 在执行fork的时候产生一个子进程,根据pid区分是子进程,还是父进程,pid为0,表示子进程。 输出结果为: Begin Parent End Child End 注意点: 1、fork的时候拷贝父进程相同的代码,所以在输出的结果中可以看到两个End。 2、是子进程先输出,还是父进程先输出,依赖于具体的Linux内核。例子中的内核为 root@typhoeus79 ice_test_m guosong]# uname -a Linux typhoeus79 2.6.30-SINA BASE_1 SMP Wed Sep 2 20:30:47 CST 2009 x86_64 x86_64 x86_64 GNU/Linux 写时拷贝(COW) http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html 在Linux程序中,fork(

使用异步委托执行线程(delegate)

[亡魂溺海] 提交于 2020-03-08 12:51:08
由于异步委托产生的线程与应用程序主线程是分开执行的,若主线程要获取异步委托线程的结果,则主线程需要等待异步委托的执行结果。 BeginInvoke是Delegate类型的一个方法,它的返回类型为IAsyncResult,通过该接口,可以获得异步委托的执行信息。 1、投票技术:等待异步委托结果的一种方法是投票技术,该技术的实现原理是通过IAsyncResult接口的IsComplete属性来检查委托是否完成了任务。EndInvote方法获取执行结果。举个例子,如下: 执行后的效果: 2、访问等待句柄技术:是等待异步委托结果的第二种方法,其实也就是使用IAsyncResultAsync接口的AsyncWaitHandle属性来访问等待句柄的,通过该属性获得一个WaitHandle对象,WaitHandle对象有个方法WaitOne()。 代码如下: 执行效果: 来源: https://www.cnblogs.com/jason-davis/p/4019948.html

基于事件的异步模式——01.backgroundWorker

一世执手 提交于 2020-03-08 12:49:06
以下内容仅作为学习提高记录,有错误恳请批评。 引用:1.C#高级编程第七版。    2.http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(v=vs.110).aspx 1.前言 在windows窗体和WPF等控件绑定到一个线程上,这时,对于每个控件,只能从创建控件的主线程中调用方法,而对于一个后台线程,就无法从主线程中访问UI控件。 对于这种可以通过异步模式实现。即创建他的线程之外的线程调用Invoke(),BeginInvoke(),EndInvoke()方法和InvokeRequried属性等异步版本。 同时可以解决界面假死现象。 2.BackgroundWorker类 BackgroundWorker类是异步事件模式的一种实现方案。   属性(摘录部分):    CancellationPending 获取一个值,指示应用程序是否已请求取消后台操作。    WorkerReportsProgress 获取或设置一个值,该值指示 BackgroundWorker 能否报告进度更新。    WorkerSupportsCancellation 获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。   方法(摘录部分):   

高性能MySQL之锁详解

感情迁移 提交于 2020-03-08 12:07:19
原文: 高性能MySQL之锁详解 一、背景 MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。数据库锁的设计的初衷是处理并发问题。我们知道多用户共享资源的时候,就有可能会出现并发访问的时候,数据库就需要合理的控制资源的访问规则,因此,锁就应运而生了,它主要用来实现这些访问规则的重要数据结构。 二、全局锁 顾名思义,全局锁就是对整个数据库实例加锁,可以通过命令 Flush tables with read lock (FTWRL)对整个数据库实例子加锁。让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。 全局锁有一个经典的使用场景就是做全库逻辑备份,也就是说吧整个数据库的每个表都用select 出来存成文本。以前有一种做法是通过FTWRL确保不会有其他线程对数据库做更新,然后对整个库做备份。注意,在备份过程中整个库完全处于只读状态。 你此时是不是觉得很危险? 如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆; 如果你在从库上备份,那么备份期间从库不能执行主库同步过来的binlog,会导致主从延迟。 看上去确实很危险,但是我们细想一下,备份为什么要加锁呢?如果我们不加锁又会出现什么问题呢? 假设你现在要维护京东的购买系统

多线程 - 守护线程Daemon是什么

北战南征 提交于 2020-03-08 12:05:42
Java线程分为用户线程和守护线程。 守护线程是程序运行的时候在后台提供一种通用服务的线程。这意味着,当一个 Java 虚拟机中不存在非 Daemon 线程的时候, Java 虚拟机也会同时停掉所有守护线程,然后退出。 Java中把线程设置为守护线程的方法:在 start 线程之前调用线程的 setDaemon(true) 方法。 注意: setDaemon(true) 必须在 start() 之前设置,否则会抛出IllegalThreadStateException异常,该线程仍默认为用户线程,继续执行 Daemon 线程被用作完成支持性工作,但是在 Java 虚拟机退出时, Daemon 线程中的 finally 块并不一定会执行 。 在构建 Daemon 线程时,不能依靠 finally 块中 的内容来确保执行关闭或清理资源的逻辑 。 守护线程创建的线程也是守护线程 守护线程不应该访问、写入持久化资源,如文件、数据库,因为它会在任何时间被停止,导致资源未释放、数据写入中断等问题 来源: https://www.cnblogs.com/frankcui/p/12441626.html