多线程

多线程之——重入锁

本小妞迷上赌 提交于 2020-04-02 14:11:05
重入锁 reentrantLock 和 synchronized 关键字相比的优势是他更加灵活,可以在任何需要的地方加锁或者释放锁。下面用这两种方式进行同步控制。 // 使用重入锁 public void run() { for (int j = 0; j < 100000; j++) { //lock 为 ReentrantLock 的一个实例 lock.lock(); try { i++; } finally { lock.unlock(); } } } // 使用 synchronized 关键字 public void run() { for (int j = 0; j < 100000; j++) { synchronized(lock){ i++; } } 两者都能在多线程的情况下保证数据的原子性,但是显然重入锁的方式更加灵活。此外重入锁可以响应中断,看下面的例子。 首先我们实例化两个重入锁类变量 lock1,lock2 ,然后用线程 1 先获得 lock1 的锁,再获得 lock2 的锁。线程 2 则先获得 lock2 的锁再获得 lock2 的锁。这样会导致死锁。此时我们可以中断线程 2 ,使得线程 2 释放 lock2 ,并退出,而线程 1 可以获得 lock2 的锁。这就体现了重入锁的一个优点:响应中断。 // 测试代码 import java.util

多线程(4)线程生命周期

寵の児 提交于 2020-04-02 14:00:12
多线程有六个状态 1.New(新创建) : 已创建但是还没有启动的新线程, new Thread()还没执行start() 2.Runnable( 可运行) :, 包括start()后等待运行和拿到资源运行中 3.Blocked(被阻塞) : synchronized修饰的代码没有拿到锁(monitor)陷入的等待状态。注意必须是synchronized修饰,其他的锁不是 4.Waiting(等待) : Object.wait(), Thread.join(), LockSupport.park()这三个没有timeout参数的方法会让线程进入等待状态. Object.notify()或者Object.notifyAll(), 等待join方法所运行的线程执行完毕, LockSupport.unpark() 会让等待的线程进入可运行状态 Lock.lock进入的是waiting状态而不是Blocked waiting和blocked的区别根本原因是“是不是内置锁”。Lock不是Java语言支持的锁,是JDK包提供的,而synchronized是关键字级别是,它们不一样。 5.Timed Waiting(计时等待) : 等待的那三个方法带了时间参数, 超时会自动唤醒也可以被notify等唤醒 6.Terminated(被终止) :run方法正常执行完,run被未捕获的异常终止 注意:

单例模式

十年热恋 提交于 2020-04-01 07:56:29
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决: 一个全局使用的类频繁地创建与销毁。 何时使用: 当您想控制实例数目,节省系统资源的时候。 如何解决: 判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码: 构造函数是私有的。 应用实例: 1、一个党只能有一个书记。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。 缺点: 没有接口,不能继承

Java-----多线程sleep(),join(),interrupt(),wait(),notify()的作用

送分小仙女□ 提交于 2020-04-01 04:30:15
关于Java多线程知识可以看看《Thinking in Java 》中的多线程部分和《Java网络编程》中第5章多线程的部分 以下是参考<<Java多线程模式>>的 1. sleep() & interrupt() 线程A正在使用sleep()暂停着: Thread.sleep(100000); 如果要取消他的等待状态,可以在正在执行的线程里(比如这里是B)调用 a.interrupt(); 令线程A放弃睡眠操作,这里a是线程A对应到的Thread实例 执行interrupt()时,并不需要获取Thread实例的锁定.任何线程在任何时刻,都可以调用其他线程interrupt().当sleep中的线程被调用interrupt()时,就会放弃暂停的状态.并抛出InterruptedException.丢出异常的,是A线程. 2. wait() & interrupt() 线程A调用了wait()进入了等待状态,也可以用interrupt()取消. 不过这时候要小心锁定的问题.线程在进入等待区,会把锁定解除,当对等待中的线程调用interrupt()时(注意是等待的线程调用其自己的interrupt()),会先重新获取锁定,再抛出异常.在获取锁定之前,是无法抛出异常的. 3. join() & interrupt() 当线程以join()等待其他线程结束时,一样可以使用interrupt

day09 并发编程

允我心安 提交于 2020-03-31 08:06:11
一. 目录   1.进程的概念和两种创建方式   2.多进程爬虫   3.守护进程   4.进程队列   5.进程队列简单应用(实现数据共享)   6.线程的两种创建方式   7.线程和进程的效率对比   8.线程共享统一进程的数据   9.死锁现象   10.线程队列的三种应用   11.多线程执行计算密集型任务   12. 线程池和进程池   13. 回调函数   14.守护线程   15. 协程   16.GlL 全局解释器锁 二. 内容 一.进程的概念和两种创建方式 专业词描述: 操作系统的两大作用 1.把硬件丑陋复杂的接口隐藏起来,为应用程序提供良好的接口 2.管理,调度进程,并且把进程之间对硬件的竞争变的有序化多道技术: 1.产生背景:为了实现单cpu下的并发效果 2.分为两个部分 1.空间上的复用(必须实现硬件层面的隔离) 2.时间上的复用(复用的是cpu的时间片) 什么时候切换? 1.正在执行的任务遇到阻塞 2.正在执行的任务运行时间过程(系统控制的)进程:正在运行的一个过程,一个任务,由操作系统负责调度,由cpu负责 执行程序:程序员写的代码并发:伪并行,单核+多道并行:只有多核才能实现真正的并行同步:一个进程在执行某个任务时,另外一个进程必须等待其执行完毕才能往下走异步:一个进程在执行某个任务时,另外一个进程无须等待其执行完毕,继续往下走进程的创建: 1

[STAThread]的含义

ε祈祈猫儿з 提交于 2020-03-31 06:42:02
Posted on 2007-07-07 10:06 桦林 阅读( 33100) 评论( 10) 编辑 收藏 [STAThread] STAThread:Single Thread Apartment Thread.(单一线程单元线程) []是用来表示Attributes; [STAThread] 是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA。用在其他方法上不产生影响。在aspx页面上可以使用 AspCompat = "true" 来达到同样的效果。这个属性只在 Com Interop 有用,如果全部是 managed code 则无用。简单的说法:[STAThread]指示应用程序的默认线程模型是单线程单元 (STA)。启动线程模型可设置为单线程单元或多线程单元。如果未对其进行设置,则该线程不被初始化。也就是说如果你用的.NET Framework,并且没有使用COM Interop,一般不需要这个Attribute。其它的还有MTA(多线程套间)、Free Thread(自由线程)。 [STAThread] attribute指示应用程序的 COM 线程模型是单线程单元。 而于此对应的多线程单元则是 [MTAThread] (多线程单元线程) COM 线程模型只适用于使用 COM

python学习——进程

两盒软妹~` 提交于 2020-03-31 02:56:48
1. 操作系统/应用程序 a. 硬件 - 硬盘 - CPU - 主板 - 显卡 - 内存 - 电源 ... b. 装系统(软件) - 系统就是一个由程序员写出来软件,该软件用于控制计算机的硬件, 让他们之间进行相互配合。 c. 安软件(安装应用程序) - QQ - 百度云 - pycharm ... 2. 并发和并行 并发,伪,由于一个人执行速度特别快,人感觉不到停顿。 并行,真,创建10个人同时操作。3. 线程、进程 a. 单进程、单线程的应用程序 print('666') b. 到底什么是线程?什么是进程? Python自己没有这玩意,Python中调用的操作系统的线程和进程。 c. 单进程、多线程的应用程序 代码: import threading print('666') def func(arg): print(arg) t = threading.Thread(target=func) t.start() print('end') 一个应用程序(软件),可以有多个进程(默认只有一个),一个进程中可以创建多个线程(默认一个)。 d. 故事: Alex甄嬛西游传 总结: 1. 操作系统帮助开发者操作硬件。 2. 程序员写好代码在操作系统上运行(依赖解释器)。 任务特别多的情况: 3. 以前的你,写代码: import threading import requests

31.Java多线程-----程序、进程、线程

試著忘記壹切 提交于 2020-03-30 17:45:07
1.程序   是为完成特定任务、用某种语言编写的一组指令的集合。即指 一段静态的代码 。 2.进程   程序的一次执行过程,或是正在运行的一个程序。 说明:进程作为 资源分配的单位 ,系统在运行时会为每个进程分配不同的内存区域 3.线程   进程可进一步细化为线程,是一个程序内部的一条执行路径。 说明:线程作为 调度和执行的单位 ,每个线程拥有独立的运行栈和程序计数器(pc),线程切换的开销小。 注意: 每个线程,拥有自己独立的:栈、程序计数器 多个线程,共享同一个进程中的结构:方法区、堆。 作者:Java之美 日期:2020-03-30 来源: https://www.cnblogs.com/897463196-a/p/12599468.html

JAVA多线程之wait/notify

…衆ロ難τιáo~ 提交于 2020-03-30 14:34:55
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法。 ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait() 与 notify/notifyAll() 的执行过程 ③中断 调用wait()方法进入等待队列的 线程 ④notify 通知的顺序不能错 ⑤多线程中测试某个条件的变化用 if 还是用 while? ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 wait() 与 notify/notifyAll() 是Object类的方法,在执行两个方法时,要先获得锁。那么怎么获得锁呢? 在这篇: JAVA多线程之Synchronized关键字--对象锁的特点 文章中介绍了使用synchronized关键字获得锁。因此,wait() 与 notify/notifyAll() 经常与synchronized搭配使用,即在synchronized修饰的同步代码块或方法里面调用wait() 与 notify/notifyAll()方法。 ②wait() 与 notify/notifyAll() 的执行过程 由于 wait() 与 notify/notifyAll() 是放在同步代码块中的, 因此线程在执行它们时,肯定是进入了临界区中的,即该线程肯定是获得了锁的。

多线程中volatile关键字的作用

随声附和 提交于 2020-03-30 12:49:08
原文链接: https://blog.csdn.net/xuwentao37x/article/details/27804169 多线程的程序是出了名的难编写、难验证、难调试、难维护,这通常是件苦差事。不正确的多线程程序可能可以运行很多年也不出一点错,直到满足某些临界的条件时,才出现意想不到的奇怪错误。 不用说,编写多线程程序的程序员需要使用可能得到的所有帮助。这期专栏将专注于讨论竞争条件(race conditions)——这通常是多线程程序中各种麻烦的根源——深入了解它并提供一些工具来防止竞争。令人惊异的是,我们将让编译器尽其所能来帮助你做这些事。 仅仅一个不起眼的关键字。 尽管C和C++标准对于线程都明显的“保持沉默”,但它们以volatile关键字的形式,确实为多线程保留了一点特权。 就象大家更熟悉的const一样,volatile是一个类型修饰符(type modifier) 。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。下面我们来一个个说明。 考虑下面的代码: 代码: class Gadget { public: void Wait() { while (!flag_) { Sleep(1000); // sleeps for 1000 milliseconds }