并发

MySQL详解--锁

旧街凉风 提交于 2019-11-29 09:59:03
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议。 MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 MySQL这3种锁的特性可大致归纳如下。 开销、加锁速度、死锁、粒度、并发性能 l 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 l 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 l 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

JAVA和Go语言的多线程并发测试二

我是研究僧i 提交于 2019-11-29 07:27:12
以前做过一次 Go 和 Java 的多线程并发对比测试( Java 、 Scala 和 Go 语言多线程并发对比测试 )。当时,测试所采用的例子是 CPU 运算密集型的,会占用大量的 CPU 资源。测试的结果 Go 并不占优势,可能的原因是,因为 CPU 资源稀少, Go 采用阻塞模式的多线程工作效率比不上 AKKA 的无阻塞模式。也就是说,对于 CPU 运算密集型的情况, Go 的多线程并发计算没有优势。可是,我以前做过读写文件和大循环的性能对比测试,发现 Go 都比 Java 要强,所以有理由相信在多线程并发的时候, Go 不应该这么差的表现。为了验证 Go 的多线程优势,我又做了一次多线程并发对比测试 . 测试内容 : IO 密集型的多线程并发计算测试。这个测试里, CPU 资源不再缺乏, IO 操作比较频繁。并且由于 IO 操作比较慢,所以线程间的 block 时间可以相对多些,意味着可以开更多的线程来完成计算任务。 具体任务:首先 , 程序从一个本地文本文件里面读取相关的股票代码以及股票对应数量 . 然后 , 再通过网络动态获取股票当前的价格 , 并汇总所有股票的总价值 . (从理论上讲,读取文件,循环遍历和快速启动多线程任务,都是 Go 的优势) 可控的因子: 1 、网络响应时间。 由于网络访问很不稳定 , 为了做比较 , 使用 Go 写了个简单的 httpserver

多线程基础必要知识点!看了学习多线程事半功倍

落爺英雄遲暮 提交于 2019-11-28 22:56:18
前言 不小心就鸽了几天没有更新了,这个星期回家咯。在学校的日子要努力一点才行! 只有光头才能变强 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 本文章的知识主要参考《Java并发编程实战》这本书的前4章,这本书的前4章都是讲解并发的基础的。要是能好好理解这些基础,那么我们往后的学习就会事半功倍。 当然了,《Java并发编程实战》可以说是非常经典的一本书。 我是未能完全理解的,在这也仅仅是抛砖引玉 。想要更加全面地理解我下面所说的知识点,可以去阅读一下这本书,总的来说还是不错的。 首先来预览一下《Java并发编程实战》前4章的目录究竟在讲什么吧: 第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性问题 1.3.3 性能问题 1.4 线程无处不在 ps: 这一部分我就不讲了 ,主要是引出我们接下来的知识点,有兴趣的同学可翻看原书~ 第2章 线程安全性 2.1 什么是线程安全性 2.2 原子性 2.2.1 竞态条件 2.2.2 示例:延迟初始化中的竞态条件 2.2.3 复合操作 2.3 加锁机制 2.3.1 内置锁 2.3.2 重入 2.4 用锁来保护状态 2.5 活跃性与性能

synchronized和reentrantlock到底锁了什么?

做~自己de王妃 提交于 2019-11-28 22:56:04
第一个类,在add clear等方法里使用可重入锁 public class LockList extends ArrayList<Object>{ private Lock lock = new ReentrantLock(false); @Override public boolean add(Object o) { lock.lock(); try{ System.out.println(Thread.currentThread().getName()+"add lock"); return super.add(o); }finally { System.out.println(Thread.currentThread().getName()+"add unlock"); lock.unlock(); } } @Override public void clear() { lock.lock(); try{ System.out.println(Thread.currentThread().getName()+"clear lock"); super.clear(); }finally { System.out.println(Thread.currentThread().getName()+"clear unlock"); lock.unlock(); } }

Java基础知识点梳理(详细)

人盡茶涼 提交于 2019-11-28 00:40:40
基本数据类型 Java内置8种基本类型 -> 6种数字类型 -> 4种整数类型: byte, short, int, long ​ -> 2种浮点类型: float, double ​ -> 1种布尔类型: boolean ​ -> 1种字符类型: char (类型大小写注意,比如boolean是原始数据类型,Boolean是对应的封装对象) 数据类型特征表 类型 位数 最小值 最大值 默认值 其他 byte 8 -128(-2^7) 127(2^7-1) 0 有符号、二进制补码表示 short 16 -32768(-2^15) 32767(2^15-1) 0 有符号、二进制补码表示 int 32 -2^31 2^31-1 0 有符号、二进制补码表示 long 64 -2^63 2^63-1 0L(0l) 有符号、二进制补码表示 float 32 2^(-149) 2^128-1 0.0f 单精度、IEEE754标准 double 64 2^(-1074) 2^1024-1 0.0d 双精度、IEEE754标准 char 16 \u0000(0) \uffff(65535) \u0000(0) 单一的、Unicode字符 浮点数内存结构 类型 位数 符号位 指数位 尾数位 float 32 1 8 23 double 64 1 11 52 原始数据类型对应的封装对象 (byte,

Java并发同步器AQS(AbstractQueuedSynchronizer)学习笔记(1)

旧街凉风 提交于 2019-11-27 10:34:52
Java中的并发包,是在Java代码中并发程序的热门话题。如果我们去读concurrent包的源码时,会发现其真正的核心是 AbstractQueuedSynchronizer , 简称 AQS 框架 , 而 Doug Lea 大神正是此包的作者。 之前也看过一遍 AbstractQueuedSynchronize,但印象不深,只有依稀的印象。这次重新学习一遍,并整理出笔记,希望对自己或者是别人有用。当然了,笔者也是浅显的过一遍,很多细节也并不是完全理解。 建议读者先看这个系列的文章:Inside AbstractQueuedSynchronizer,之后再继续本篇。 首先,AQS会对进行 acquire 而被阻塞的线程进行管理,说是管理,其实就是内部维护了一个FIFO队列,这个队列是一个双向链表。链头可以理解为是一个空的节点,除了链头以外,每个节点内部都持有着一个线程,同时,有着两个重要的字段:waitStatus 和 nextWaiter。nextWaiter一般是作用与在使用Condition时的队列。而waitStatus则有以下几个字段: SIGNAL 表示下一个节点应该被唤醒。为什么是下一个节点?因为刚刚说了,这个FIFO队列,链头都是一个空的节点,但此节点的 waitStatus 正好就表示了要对下一节点做的事情 CANCELLED 表示此节点持有的线程被中断

Java7中的ForkJoin并发框架初探(下)—— ForkJoin的应用

不羁的心 提交于 2019-11-27 02:46:03
前两篇文章已经对Fork Join的设计和JDK中源码的简要分析。这篇文章,我们来简单地看看我们在开发中怎么对JDK提供的工具类进行应用,以提高我们的需求处理效率。 Fork Join这东西确实用好了能给我们的任务处理提高效率,也为开发带来方便。但Fork Join不是那么容易用好的,我们先来看几个例子(反例)。 ####1. 反例错误分析 我们先来看看这篇文章中提供的例子: http://www.iteye.com/topic/643724 (因为是反例,就不提供超链接了,只以普通文本给出URL) 这篇文章是我学习和整理Fork Join时搜索到的一篇文章,其实总的来说这篇文章前面分析得还是比较好的,只是给出的第一个例子(有返回结果的RecursiveTask应用的例子)没有正确地对Fork Join进行应用。为了方便分析,还是贴下这个例子中具体的的代码吧。 public class Calculator extends RecursiveTask { private static final int THRESHOLD = 100; private int start; private int end; public Calculator(int start, int end) { this.start = start; this.end = end; } @Override

Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理

二次信任 提交于 2019-11-27 02:45:48
最近事情较多,好久没发文章了。前面关于Java并发的文章中主要介绍了并发的概念、思想、JavaSE5中java.util.concurrent包中的工具类的使用和实现源码的分析。 这篇我们来简要了解一下JavaSE7中提供的一个新特性 —— Fork Join 框架 。 0. 处理器发展和需求背景 回想一下并发开发的初衷,其实可以说是有两点,或者说可以从两个方面看。 对于单核的处理器来说,在进行IO操作等比较费时的操作进行时,如果执行任务的方式是单任务的,那么CPU将会“空转”,知道IO操作结束。如果有多任务的调度机制,则在一个任务不需要CPU支持的时候,CPU可以被调度处理其他任务。简单地讲,并发可以提高CPU计算资源的利用率。 对于多核,或者多个计算资源的情况下,并发可以在某种程度上达到“并行”,即同时运行,缩短了任务完成的时间,提高了任务完成的效率。 我们再来看一下处理器计算能力的发展(讲并发或者并行基本都要提到),Intel的创始人之一Gordon Moore曾经说过一句话,大概意思是: 当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。 我们可以这样理解,处理器的计算能力在一定意义上和芯片上集成的晶体管数量有关,而这项继承技术的发展史飞快的。但是,什么事情都是有一个极限的,提升计算性能仅仅靠增加晶体管数量提高处理器主频是不现实的