![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 66
sahahsha
情深不寿,慧极必伤
展开
-
JUC体系图
参考:https://blog.csdn.net/TZ845195485/article/details/109210263原创 2021-03-11 14:27:28 · 308 阅读 · 0 评论 -
阻塞锁与自旋锁
在学习JAVA并发包的时候发现其底层的实现是通过AQS框架来完成的,而AQS框架中维护了一个CLH队列,CLH队列使用了CLH锁,因此上网搜了下这方面的内容,发现原来在并行编程中有这么多的锁类型,索性做个总结,此为本篇内容的缘由.阻塞锁阻塞锁是指当线程尝试获取锁失败时,线程进入阻塞状态,直到接收信号后被唤醒.(线程的状态包括新建、就绪、运行、阻塞及死亡)在JAVA中,能够唤醒阻塞线程的操作包括Object.notify, Object.notifyAll, Condition.signal, Loc原创 2021-02-07 15:17:01 · 735 阅读 · 0 评论 -
进程间的通信方式
1、几种进程间的通信方式# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访转载 2017-09-27 09:44:55 · 154 阅读 · 0 评论 -
线程,进程,协程
没有啥复杂的东西,考虑清楚需求,就可以很自然的衍生出这些解决方案。一开始大家想要同一时间执行那么三五个程序,大家能一块跑一跑。特别是UI什么的,别一上计算量比较大的玩意就跟死机一样。于是就有了并发,从程序员的角度可以看成是多个独立的逻辑流。内部可以是多cpu并行,也可以是单cpu时间分片,能快速的切换逻辑流,看起来像是大家一块跑的就行。但是一块跑就有问题了。我计算到一半,刚把多次方程解转载 2017-09-09 10:25:20 · 206 阅读 · 0 评论 -
多线程运用场景
多线程使用的主要目的在于:1、吞吐量:你做WEB,容器帮你做了多线程,但是他只能帮你做请求层面的。简单的说,可能就是一个请求一个线程。或多个请求一个线程。如果是单线程,那同时只能处理一个用户的请求。2、伸缩性:也就是说,你可以通过增加CPU核数来提升性能。如果是单线程,那程序执行到死也就利用了单核,肯定没办法通过增加CPU核数来提升性能。鉴于你是做WEB的,第1点可能你几乎转载 2017-09-11 10:20:31 · 345 阅读 · 0 评论 -
AtomicInteger的CAS原理,及为啥不用synchronized而用cas
CAS原理: 通过查看AtomicInteger的源码可知, `private volatile int value;public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this,转载 2017-09-11 10:50:07 · 4474 阅读 · 2 评论 -
乐观锁与悲观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,...转载 2017-07-12 12:17:35 · 184 阅读 · 0 评论 -
JVM中线程的状态转换图
JVM中线程的状态转换图线程在一定条件下,状态会发生变化。线程一共有以下几种状态:1、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。3、运行状转载 2017-10-09 11:22:26 · 394 阅读 · 0 评论 -
锁、volatile、CAS 比较
一。锁的劣势 (1) 在JDK1.5之前都是使用synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有守护变量的锁,都采用独占的方式来访问这些变量 (2)如果出现多个线程同时访问锁,则一些线程将被挂起,当线程恢复执行时,必须等待其它线程执行完他们的时间片以后才能被调度执行,在挂起和恢复执行过程中存在着很大的开销 ...原创 2017-09-10 23:32:21 · 468 阅读 · 0 评论 -
线程的几种状态
线程在一定条件下,状态会发生变化。线程一共有以下几种状态:1、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。3、运行状态(Running):就绪状态的转载 2017-09-26 17:03:09 · 274 阅读 · 0 评论 -
Java 中的悲观锁和乐观锁的实现
锁(locking)业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数据再发生变化。此时,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的“锁”,即给我们选定的目转载 2017-09-18 12:45:23 · 451 阅读 · 0 评论 -
[数据库]事务、并发、数据库锁
一 事务事务的定义事务的特性二 并发带来的问题1 问题脏读虚读幻读不可重复读2 隔离级别可读取未确认Read uncommitted可读取确认Read committed可重复读Repeatable read可串行化Serializable三 数据库锁共享锁排他锁更新锁锁的粒度乐观锁与悲观锁一 、事务1 事转载 2017-07-15 17:32:29 · 284 阅读 · 0 评论 -
Java里面线程池,及常用四种线程池的使用
1,什么是线程池?什么是线程池呢,就先准备好若干个线程等待执行任务,只要任务来了,存放线程的容器就是线程池,然后从池子拿出一个线程来让这个线程进行服务。好处是什么呢?好的软件设计不建议手动创建和销毁线程。线程的创建和销毁是非常耗 CPU 和内存的,因为这需要 JVM 和操作系统的参与。64位 JVM 默认线程栈是大小1 MB。这就是为什么说在请求频繁时为每个小的请求创建原创 2017-08-20 16:52:27 · 421 阅读 · 0 评论 -
自己设计线程池
一,线程池的基本要素线程池一般需要一个线程管理类: ThreadPoolManager,其作用有: 1)提供创建一定数量的线程的方法。主线程调用该方法,从而创建线程。创建的线程执行自己的例程,线程的例程阻塞在任务抓取上。 2)提供对任务队列的操作的方法。主线程调用初始化任务队列的方法,然后在有任务的时候,调用提供的任务添加方法,将任务添入等待队列。当主线程调用任务的添加方法转载 2017-08-20 17:24:06 · 3566 阅读 · 0 评论 -
Java并发编程:Synchronized及其实现原理
一、Synchronized的基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法上讲,Synchronized总共有三种用法: (1)修饰普通方法 (2)修饰静态方法转载 2017-08-21 10:28:12 · 262 阅读 · 0 评论 -
造成HashMap非线程安全的原因
在前面我的一篇总结线程范围内共享数据文章中提到,为了数据能在线程范围内使用,我用了HashMap来存储不同线程中的数据,key为当前线程,value为当前线程中的数据。我取的时候根据当前线程名从HashMap中取即可。 因为当初学习HashMap和HashTable源码的时候,知道HashTable是线程安全的,因为里面的方法使用了synchronized进行同步,但是HashMap没有,转载 2017-08-25 22:49:32 · 292 阅读 · 0 评论 -
Java NIO和IO的主要区别
当学习了Java NIO和IO的API后,一个问题马上涌入脑海:我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异、它们的使用场景,以及它们如何影响您的代码设计。 Java NIO和IO的主要区别下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异。IO NIO面向流 ...转载 2017-08-23 09:04:44 · 197 阅读 · 0 评论 -
java可重入锁(ReentrantLock)的实现原理
前言相信学过Java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么实现的。如果真是这样,而且你有兴趣了解,今天我将带领你轻松的学习下java中非常重要,也非常基础的可重入锁-ReentrantLock的实现机制。听故事把知识掌握了在一个村子里面转载 2017-08-23 10:17:40 · 253 阅读 · 0 评论 -
hashmap,hashTable concurrentHashMap 是否线程安全,及实现
线程安全类在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许许多多非线程安全的类。 下面是这些线程安全的同步的类:vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。statck:堆栈类,先进后出原创 2017-08-28 14:14:03 · 854 阅读 · 0 评论 -
MySQL InnoDB锁机制之Gap Lock、Next-Key Lock
MySQL InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析 MySQL InnoDB支持三种行锁定方式:l 行锁(Record Lock):锁直接加在索引记录上面,锁住的是key。l 间隙锁(Gap Lock):锁定索引记录间隙,确保索引记录的间隙不转载 2017-08-24 14:44:06 · 488 阅读 · 0 评论 -
MySQL 加锁处理分析
1 背景 11.1 MVCC:Snapshot Read vs Current Read 21.2 Cluster Index:聚簇索引 31.3 2PL:Two-Phase Locking 31.4 Isolation Level 42 一条简单SQL的加转载 2017-08-24 14:44:21 · 206 阅读 · 0 评论 -
Java的ReentrantLock构造函数中提供了两种锁:创建公平锁和非公平锁
总括: 在Java的ReentrantLock构造函数中提供了两种锁:创建公平锁和非公平锁(默认)。代码如下:public ReentrantLock() {sync = new NonfairSync();}在公平的锁上,线程按照他们发出请求的顺序获取锁,但在非公平锁上,则允许‘插队’:当一个线程请求非公平锁时,如果在发出请求的转载 2017-08-31 10:49:53 · 973 阅读 · 0 评论 -
公平锁与非公平锁
总括: 在Java的ReentrantLock构造函数中提供了两种锁:创建公平锁和非公平锁(默认)。代码如下:public ReentrantLock() {sync = new NonfairSync();}在公平的锁上,线程按照他们发出请求的顺序获取锁,但在非公平锁上,则允许‘插队’:当一个线程请求非公平锁时,如果在发出请求的原创 2017-09-17 18:10:04 · 263 阅读 · 0 评论