线程阻塞

Java对象和锁

巧了我就是萌 提交于 2020-04-06 18:04:32
Java对象保存在内存中时,由以下三部分组成: 对象头 实例数据 对齐填充字节 而对象头又由下面几部分组成: Mark Word 指向类的指针 数组长度(只有数组对象才有) 1. Mark Word Mark Word记录了对象和锁有关的信息,当这个对象被synchronized关键字当成同步锁时,围绕这个锁的一系列操作都和Mark Word有关。Mark Word在32位JVM中的长度是32bit,在64位JVM中长度是64bit。 Mark Word在不同的锁状态下存储的内容不同,在32位JVM中是这么存的: 其中无锁和偏向锁的锁标志位都是01,只是在前面的1bit区分了这是无锁状态还是偏向锁状态。Epoch是指偏向锁的时间戳。 JDK1.6以后的版本在处理同步锁时存在锁升级的概念,JVM对于同步锁的处理是从偏向锁开始的,随着竞争越来越激烈,处理方式从偏向锁升级到轻量级锁,最终升级到重量级锁。 JVM一般是这样使用锁和Mark Word的: step1:当没有被当成锁时,这就是一个普通的对象,Mark Word记录对象的HashCode,锁标志位是01,是否偏向锁那一位是0。 step2:当对象被当做同步锁并有一个线程A抢到了锁时,锁标志位还是01,但是否偏向锁那一位改成1,前23bit记录抢到锁的线程id,表示进入偏向锁状态。 step3:当线程A再次试图来获得锁时

你还在用 Date?建议使用 LocalDateTime 了!

我的未来我决定 提交于 2020-04-06 12:27:50
在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗? 通过阅读本篇文章你将了解到: 为什么需要LocalDate、LocalTime、LocalDateTime【java8新提供的类】; java8新的时间API的使用方式,包括创建、格式化、解析、计算、修改。 为什么需要LocalDate、LocalTime、LocalDateTime 1.Date如果不格式化,打印出的日期可读性差 Tue Sep 10 09:34:04 CST 2019 2.使用SimpleDateFormat对时间进行格式化,但SimpleDateFormat是线程不安全的SimpleDateFormat的format方法最终调用代码: private StringBuffer format(Date date, StringBuffer toAppendTo, FieldDelegate delegate) { // Convert input date to time field list calendar.setTime(date); boolean useDateFormatSymbols = useDateFormatSymbols(); for (int i = 0; i < compiledPattern

Python并发编程之多线程使用

瘦欲@ 提交于 2020-04-06 11:34:24
目录 一 开启线程的两种方式 二 在一个进程下开启多个线程与在一个进程下开启多个子进程的区别 三 练习 四 线程相关的其他方法 五 守护线程 六 Python GIL(Global Interpreter Lock) 七 同步锁 八 死锁现象与递归锁 九 信号量Semaphore 十 Event 十一 条件Condition(了解) 十二 定时器 十三 线程queue 十四 Python标准模块--concurrent.futures 一 开启线程的两种方式 ``` #方式一 from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name) if name == ' main ': t=Thread(target=sayhi,args=('egon',)) t.start() print('主线程') 方式二 from threading import Thread import time class Sayhi(Thread): def init (self,name): super(). init () self.name=name def run(self): time.sleep(2) print('%s say hello' % self

并发编程之线程、线程定时器、进程池、线程池(更新中....)

旧时模样 提交于 2020-04-06 11:33:58
线程queue用法 import queue q = queue.Queue() 队列 先进先出 q = queue.LifoQueue() #堆栈 先进后出 q = queue.PriorityQueue() # 可以根据优先级取数据 线程定时器 导入 from threading import Thread,Timer 使用 t = Timer(4,task) #过了4秒开启了一个线程 socket 多线程 服务端 import socket from threading import Thread def task(conn): while True: try: msg = conn.recv(1024) if len(msg) == 0:break conn.send(msg.upper()) except Exception: print("客户端关闭了一个链接") break def run(): while True: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(('127.0.0.1',8020)) s.listen(5) while True: conn,addr = s.accept() t = Thread(target=task,args=(conn,)) t.start() if

并发编程的艺术07-非阻塞同步演进

ぃ、小莉子 提交于 2020-04-06 11:32:16
前言 不知道大家有没有发现几乎每个专业领域中都充斥着很多抽象的专业名词,如果没有相关的基础知识很难知道这些专业名词是什么意思,就比如说我们的这个标题“粗粒度同步”。川建国听了想骂娘,什么是TMD“粗粒度同步”?最近我对理查德·费曼做了一些了解,他在阐述一个事物的时候强调要用通俗易懂的语言,让人容易理解的方式而不是专业名词满天飞。对于一个事物能够给一个孩子或者是一个对此不了解的外行人讲明白就说明你自己是真的明白了。所以我们的技术类文章也会力求用通俗易懂的方式把事物讲的让人更容易理解,而不是使用大量的专业名词。 本章内容我们将以一个集合作为例子,集合中有 add , remove ,contains 三个函数。 add(x) 函数将元素 x 添加到集合中,当且仅当集合中原先不存在 x 时返回 true。 remove(x) 函数将元素 x 从集合中删除,当且仅当集合中原来存在 x 的时候返回 true 。 当且仅当集合中包含 x 元素时 contains(x) 返回 true。 链表中除了包含集合元素的常规节点外,还使用了两个称为 head , tail 的哨兵节点,作为链表的第一个节点和最后一个节点。哨兵节点不能被添加,删除,或查找,它们的 key 值分别为整数值的最小和最大值,也就是说 key 值越大的元素排序越靠后。 粗粒度同步 “粗粒度同步

并发编程-多线程,GIL锁

倾然丶 夕夏残阳落幕 提交于 2020-04-06 11:32:00
本章内容: 1.什么是GIL 2.GIL带来的问题 3.为什么需要GIL 4.关于GIL的性能讨论 5.自定义的线程互斥锁与GIL的区别 6.线程池与进程池 7.同步异步,阻塞非阻塞 一.什么是GIL 官方解释: ''' In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.) ''' 释义: 在CPython中,这个全局解释器锁,也称为GIL,是一个互斥锁,防止多个线程在同一时间执行Python字节码,这个锁是非常重要的,因为CPython的内存管理非线程安全的,很多其他的特性依赖于GIL,所以即使它影响了程序效率也无法将其直接去除 总结: 在CPython中,GIL会把线程的并行变成串行

进程,线程和协程

强颜欢笑 提交于 2020-04-06 10:50:27
1,任务调度 要理解进程和线程,必须要先了解一下操作系统的一些相关概念。大部分操作系统(如Windows、Linux)的 任务调度 是采用 时间片轮转的抢占式调度方式 ,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发(别觉得并发有多高深,它的实现很复杂,但它的概念很简单,就是一句话:多个任务同时执行)。多任务运行过程的示意图如下: 操作系统中的任务调度 2,进程 我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序侧是具有某种功能的程序,程序是运行于操作系统之上的。 进程 是一个具有一定独立功能的 程序在一个数据集上的一次动态执行的过程, 是应用程序运行的载体, 操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位 。 进程一般由程序、数据集合和进程控制块三部分组成。 程序用于描述进程要完成的功能

音视频入门之如何绘制一张图片

烂漫一生 提交于 2020-04-06 10:35:59
Android 的音视频入门学习,首先了解一下绘制图片。在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View作绘制图片。下面我以SurfaceView作重点来讲,为什么不用其他的来作例子,分析完SurfaceView就是知道为什么要用SurfaceView作例子。 SurfaceView 我们以下面几个点来了解SurfaceView SurfaceView 有那些相关类。 SurfaceView 有那些特点。 如何使用SurfaceView呢。 SurfaceView的优缺。 SurfaceView 在视频开发中应用在那里。 SurfaceView 其实是继承了View ,但与View又有一些区别,View是通过 onDraw(Canvas canvas)方法中的Canvas去绘制自身显示有界面上,而SurfaceView则不需要onDraw方法,有人会有些疑问,如果SurfaceView不需要实现onDraw方法怎么去绘制自身呢?其实View是在UI线程中绘制的,SurfaceView是在子线程中绘制的(即在一个子线程中对自己进行绘制)。在子线程中绘制怎么拿到canvas呢?下面我们去了解SurfaceView 有那些相关类。 SurfaceView 有那些相关类。 有三个重要的类,分别如下:

如何优雅的关闭Java线程池

♀尐吖头ヾ 提交于 2020-04-06 08:52:02
如何优雅的关闭Java线程池 面试中经常会问到,创建一个线程池需要哪些参数啊,线程池的工作原理啊,却很少会问到线程池如何安全关闭的。 也正是因为大家不是很关注这块,即便是工作三四年的人,也会有因为线程池关闭不合理,导致应用无法正常stop的情况,还有出现一些报错的问题。 本篇就以ThreadPoolExecutor为例,来介绍下如何优雅的关闭线程池。 01 线程中断 在介绍线程池关闭之前,先介绍下Thread的interrupt。 在程序中,我们是不能随便中断一个线程的,因为这是极其不安全的操作,我们无法知道这个线程正运行在什么状态,它可能持有某把锁,强行中断可能导致锁不能释放的问题;或者线程可能在操作数据库,强行中断导致数据不一致混乱的问题。正因此,JAVA里将Thread的stop方法设置为过时,以禁止大家使用。 一个线程什么时候可以退出呢?当然只有线程自己才能知道。 所以我们这里要说的Thread的interrrupt方法,本质不是用来中断一个线程。是将线程设置一个中断状态。 当我们调用线程的interrupt方法,它有两个作用: 1、如果此线程处于阻塞状态(比如调用了wait方法,io等待),则会立马退出阻塞,并抛出InterruptedException异常,线程就可以通过捕获InterruptedException来做一定的处理,然后让线程退出。 2

python 第八天

情到浓时终转凉″ 提交于 2020-04-06 05:49:02
1、paramiko模块 1.1、此函数是ssh模块: import paramikodef ssh2(ip='127.0.0.1',port=22,username='',passwd='',cmd=''): """ ssh连接服务器 :return: """ ssh = paramiko.SSHClient() #创建SSH对象 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机 ssh.connect(ip,int(port),username,passwd) #连接服务器 stdin,stdout,stderr = ssh.exec_command(cmd) #执行命令,标准输入,输出,错误三个变量中 result = stdout.read() #获取命令的结果,输出是字节的类型 print(result.decode("utf-8")) #将字节的类型转换为utf-8 ssh.close()ssh2("192.168.1.1",22,"root","123456","df")1.2、sftpclient: import paramikotransport = paramiko.Transport(('192.168.1.1',22))transport