线程

C# 实现生产者消费者队列

杀马特。学长 韩版系。学妹 提交于 2020-03-28 22:59:50
开发过程中经常会碰到这样的场景:需要从一个地方获取一些数据,然后处理数据并将其保存在数据库中。 private void FetchData() {} private void SaveData() {} static void Main(string[] args) { for (int i = 0; i < 10; i++) { FetchData(); // 获取数据 SaveData(); // 处理并保存 } } 例如上述代码例子这样顺序执行,执行会很慢,原因是获取数据和处理并保存的过程都可能导致阻塞,然而FetchData()每次取数据并不需要等待上一条数据保存完成再进行。 这样的场景非常适合用 生产者消费者队列 :生产者就是FetchData(),用来生产数据;消费者SaveData(),用来消费数据。 举个实际例子,我们需要通过一个Web Api获取一些城市的天气情况,并将其保存到数据库中。 实现方式: 需要一个任务队列,生产者可以向队列中插入任务,消费者可以从任务队列中取出任务来执行。 为保证线程安全,使用一个锁来保护这个队列的访问。 制定一个退出策略,在所有任务完成时释放资源。 下边是实现的完整代码: class Program { // 任务队列 static Queue<string> _tasks = new Queue<string>(); //

java 多线程安全问题

旧时模样 提交于 2020-03-28 20:41:58
通过卖票程序发现问题重复售票或者售票负数 class Ticket implements Runnable{ private int tick=100; @Override public void run() { while (true){ if (tick>0){ try { Thread.sleep(10);//多个线程等待,然后又获得了执行权 }catch (InterruptedException e){ } System.out.println(Thread.currentThread().getName()+"...sale:"+tick--); } } } } public class Demo { public static void main(String[] args) { Ticket t = new Ticket(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); t2.start(); } } 当多条语句在操作同一个共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误。 解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行中,其他线程不可以参与执行。 Java多线程安全解决方式:同步代码块 class

线程安全函数是什么

戏子无情 提交于 2020-03-28 16:41:22
什么是线程安全? 一个函数被多个并发线程 反复调用时,它会一直产生正确的结果 ,则该函数是线程安全函数。 那么什么又是可重入函数? 当一个函数在被一个线程调用时,可以 允许被其他线程再调用 。即两个函数“ 同时 ”发生。则该函数是可重入函数。 所以,显而易见,如果一个函数是可重入的,那么它肯定是线程安全的。但反之未然,一个函数是线程安全的,却未必是可重入的。比如我们在一个函数中调用到了一个全局变量NUM用来标记某一东西的数量。学个操作系统的同学都知道,如果我们在修改它的值的时候发生了中断,两一个函数又对他进行了修改,此时该变量的值会出错。这种函数就是线程不安全函数。他是属于没有保护共享变量的线程不安全函数。在单线程时运行毫无问题,但一旦放到多线程中就容易出bug。但如果我们在修改这个全局变量NUM前对他进行加锁,再操作完后再进行解锁。这样即使有两个线程在调用这个函数,其结果也不会出问题。此时,这个函数就是线程安全函数。但他依旧不是可重入函数。因为他不能保证两个函数“同时”运行,必须等待解锁后才能运行。而我们在平时开发中应该尽量编写可重入的函数。 如下图: 线程不安全函数主要分为以下四大类: 第一类:不保护共享变量的函数, a, 函数中访问全局变量和堆。 共享变量在多线程中是共享数据比如全局变量和堆,如果不保护共享变量,多线程时会出bug。 可以通过同步机制来保护共享数据,比如加锁。

第十三周学习报告

拟墨画扇 提交于 2020-03-28 15:26:37
第十三周(11.30-12.06): 一、学习目标 1. 掌握三种并发的方式:进程、线程、I/O多路复用 2. 掌握线程控制及相关系统调用 3. 掌握线程同步互斥及相关系统调用 二、学习资源 1. 教材:第十一章《网络编程》简单过一下 2. 教材:第十二章《并发编程》 并发编程 如果逻辑控制流在时间上重叠,那么他们就是并发的,这种常见的现象叫做并发。 并发不限制于内核: 访问慢速I/O 设备 与人交互 通过推迟工作以降低延迟 服务多个网络客户端 在多核机器上进行并发计算 进程 I/O多路复用 线程 12.1基于进程的并发编程 第一步:服务器接受客户端的连接请求 第二步:服务器派生一个子进程为这个客服端服务 第三步:服务器接受另一个连接请求 第四步:服务器派生另一个子进程为新的客户端服务 12.1.2关于进程的优劣 模型:共享文件表,但是不共享用户地址空间 独立的地址空间使得进程共享状态信息变得更加困难 基于I/O多路复用的并发编程 对于两个事件: 网络客户端发起的连接请求 用户在键盘上输入命令行 针对不知道等待哪个事件,一个解决办法就是I/O多路复用技术。 基本思路就是使用select函数,要求内核挂起进程,只有在一个或者多个I/O事件发生后,才将控制返回给应用程序,就像P651事例一样: 当集合{0,4}中任意描述符准备好读时返回。 当集合{1,2,7}中任意描述符准备好写时返回

Java多线程-入门知识

让人想犯罪 __ 提交于 2020-03-28 13:49:23
通用知识-名词解释 多任务:统一时间可以运行多个任务(应用程序),但存在并发(同一个CPU上)于并行(多个CPU同时处理)的区别. 进程:进程是线程的容器。是包含程序的指令、数据及其组织形式的描述,进程是程序的实体,保持着当前程序的活动状态。 线程:一条线程指的是进程中一个单一顺序的执行线,也是操作系统能够进行运算调度的最小单位,可共享进程的所有资源,也有自己的调用栈(call stack),寄存器环境(register context),线程本地存储(thread-local storage). 多线程:在一个进程中存在多条线程,同时执行抢夺CPU执行权. 线程的生命周期:一条线程从创建到死亡的过程,一般是1-10级. 线程优先级:设置线程优先级只能说明应该被优先执行,而不是一定是优先执行. Java知识-名词解释 Java进程: 一个Java进程等于一个JVM进程. java线程:main函数就是一条线程的入口,也称为主线程. Java线程生命周期: 来源: https://www.cnblogs.com/laxilo/p/12586886.html

并发编程相关面试题四

倖福魔咒の 提交于 2020-03-28 12:34:17
一、Java开发中用过哪些锁 1、乐观锁   乐观锁顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS(Compare and Swap 比较并交换)实现的   乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升;     乐观锁在Java中的使用,是无锁编程,常常采用的是CAS算法,典型的例子就是原子类,通过CAS自旋实现原子操作的更新。 2、悲观锁   悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。比如Java里面的同步原语synchronized关键字的实现就是悲观锁。   悲观锁适合写操作非常多的场景;   悲观锁在Java中的使用,就是利用各种锁; 3、独享锁   独享锁是指该锁一次只能被一个线程所持有。   独享锁通过AQS来实现的,通过实现不同的方法,来实现独享锁。   对于Synchronized而言,当然是独享锁。 4、共享锁   共享锁是指该锁可被多个线程所持有。  

2020年-Java面试题大汇总

有些话、适合烂在心里 提交于 2020-03-28 10:57:23
【推荐】我凭这三招轻松拿到offer.pdf(吐血整理) >>> 基础部分一 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 2、Java有没有goto? 3、说说&和&&的区别。 4、在JAVA中如何跳出当前的多重嵌套循环? 5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 6、short s1= 1; s1 = (s1+1是int类型,而等号左边的是short类型,所以需要强转)1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?(没有错) 7、char型变量中能不能存贮一个中文汉字?为什么? 8、用最有效率的方法算出2乘以8等於几? 9、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 10,静态变量和实例变量的区别? 基础部分二 11、是否可以从一个static方法内部发出对非static方法的调用? 12、Integer与int的区别 13、Math.round(11.5)等於多少?Math.round(-11.5)等於多少? 14、Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型? 15、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)

python 进程线程简单理解

戏子无情 提交于 2020-03-28 07:44:13
简单的理解 1、线程:最小的执行单元;进程:最小的资源单元 2、一个程序至少有一个进程,一个进程至少有一个线程(线程可以理解为线程的容器) 3、进程在执行过程中拥有独立的内存单元,而多个线程共享内存 4、每一个独立的线程都有 程序的入口,顺序执行的序列和程序出口 ,但是线程不能独立执行,必须由应用程序提供多个线程执行控制 5、进程是系统进行资源分配和调度的一个独立单元 多线程的代码开启 import threading import time def sing(): print("begin to sing %s" % time.ctime()) time.sleep(3) print("stop to sing %s" % time.ctime()) def jump(): print("begin to jump %s" % time.ctime()) time.sleep(5) print("stop to jump %s" % time.ctime()) def rap(): print("begin to rap %s" % time.ctime()) time.sleep(7) print("stop to rap %s" % time.ctime()) def play_basketball(): print("begin to play_basketball %s"

Java 多线程(六) synchronized关键字详解

你。 提交于 2020-03-28 07:32:23
Java 多线程(六) synchronized关键字详解   多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。   同步机制可以使用 synchronized关键字 实现。    当synchronized关键字修饰一个方法的时候,该方法叫做 同步方法 。   当synchronized方法执行完或发生异常时,会自动释放锁。   下面通过一个例子来对synchronized关键字的用法进行解析。   1.是否使用synchronized关键字的不同 例子程序1   public class ThreadTest   {      public static void main(String[] args)     {       Example example = new Example();       Thread t1 = new Thread1(example);       Thread t2 = new Thread1(example);       t1.start();       t2.start();     }   }   class Example   {      public synchronized void execute()     {        for ( int i

java synchronized 线程同步机制详解

ⅰ亾dé卋堺 提交于 2020-03-28 07:27:50
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。 三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。 四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。 五、以上规则对其它对象锁同样适用. 1.同步代码块,使用的锁可以是任意对象,但是操作共享资源时,锁必须唯一! 2.同步函数,使用的锁是this! 好处:解决线程的安全问题 缺点:都会判断同步锁,降低效率,同步函数设置在run函数上,会被某个线程一直占用