并发
猪猪猪猪猪鸭
十年磨一剑。
展开
-
java 用户级线程和核心级线程的区别是什么
原创 2018-03-15 10:22:26 · 2187 阅读 · 4 评论 -
Java并发编程的艺术(一)——并发编程需要注意的问题
并发是为了提升程序的执行速度,但并不是多线程一定比单线程高效,而且并发编程容易出错。若要实现正确且高效的并发,就要在开发过程中时刻注意以下三个问题:上下文切换死锁资源限制接下来会逐一分析这三个问题,并给出相应的解决方案。问题一:上下文切换会带来额外的开销线程的运行机制一个CPU每个时刻只能执行一条线程;操作系统给每条线程分配不同长度的时间片;操作系统会从一堆线程中随机选取一条来执行;每条线程用完自...原创 2018-03-20 00:15:56 · 453 阅读 · 0 评论 -
java-面试-Java并发容器大合集
概述 java.util包中的大部分容器都是非线程安全的,若要在多线程中使用容器,你可以使用Collections提供的包装函数:synchronizedXXX,将普通容器变成线程安全的容器。但该方法仅仅是简单地给容器使用同步,效率很低。因此并发大师Doug Lea提供了java.util.concurrent包,提供高效的并发容器。并且为了保持与普通的容器的接口一致性,仍然使用ut...原创 2018-03-20 00:15:42 · 3848 阅读 · 0 评论 -
架构高性能网站秘笈(一)——了解衡量网站性能的指标
服务器如何发送数据?服务器程序将需要发送的数据写入该程序的内存空间中;服务器程序通过操作系统的接口向内核发出系统调用;系统内核将用户态内存空间中的数据复制到内核缓冲区中去,然后通知网卡过来取;此后CPU转而做其他处理;网卡到CPU指定的内核缓冲区中将数据复制到网卡缓冲区中;网卡将字节转换成二进制位,再以电信号的形式输出至网络。注意:数据在计算机内部的复制是按照总线的宽度来复制的。比如在32位的操作...原创 2018-03-21 14:40:16 · 575 阅读 · 0 评论 -
架构高性能网站秘笈(二)——动态内容缓存
什么是动态内容缓存?浏览器向服务器发送请求后,服务器会根据浏览器的要求做相应的处理(如:数据库操作),然后将处理后的结果注入JSP页面生成HTML,最后将生成的HTML返回给浏览器显示。我们知道,数据库读取操作是非常耗时的,如果能将每次请求中的数据库处理时间去掉,那服务器的相应速度将会大幅提升。要实现这一点,我们就需要将常用的HTML页面事先生成好,当用户发出请求时,服务器只需从缓存中取出即可,无...原创 2018-03-21 14:40:56 · 207 阅读 · 0 评论 -
架构高性能网站秘笈(三)——浏览器缓存
什么是浏览器缓存?在《架构高性能网站秘笈(二)——动态内容缓存》中我们知道,当不同用户请求相同数据时,动态内容缓存能够避免服务器的重复计算,从而降低用户的等待时间。但如果是同一个用户请求相同的数据,即使服务器能避免重复计算,但仍需将重复的数据传递给浏览器。若使用浏览器缓存,则同一个用户请求相同的数据时,浏览器只需从自己本地读取,无需从服务器上获取。从而大大降低用户的等待时间,减少了服务器的压力,可...原创 2018-03-21 14:41:52 · 229 阅读 · 0 评论 -
CAS原理分析
一、锁机制常用的锁机制有两种:1、悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。悲观锁的实现,往往依靠底层提供的锁机制;悲观锁会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。2、乐观锁:假设不会发生并发冲突,每次不加锁而是假设没有冲突而去完成某项操作,只在提交操作时检查是否违反数据完整性。如果因为冲突失败就重试,直到成功为止。乐观锁大多是基于数据版本记录机制实现。为数据增加...原创 2018-04-12 18:08:48 · 249 阅读 · 1 评论 -
Java并发编程的艺术(十二)——线程安全
1. 什么是『线程安全』?如果一个对象构造完成后,调用者无需额外的操作,就可以在多线程环境下随意地使用,并且不发生错误,那么这个对象就是线程安全的。2. 线程安全的几种程度线程安全性的前提:对『线程安全性』的讨论必须建立在对象内部存在共享变量这一前提,若对象在多条线程间没有共享数据,那这个对象一定是线程安全的!2.1. 绝对的线程安全上述线程安全性的定义即为绝对线程安全的情况,即:一个对象在构造完...原创 2018-05-12 10:24:22 · 344 阅读 · 0 评论 -
Java并发编程的艺术(十三)——锁优化
自旋锁背景:互斥同步对性能最大的影响是阻塞,挂起和恢复线程都需要转入内核态中完成;并且通常情况下,共享数据的锁定状态只持续很短的一段时间,为了这很短的一段时间进行上下文切换并不值得。原理:当一条线程需要请求一把已经被占用的锁时,并不会进入阻塞状态,而是继续持有CPU执行权等待一段时间,该过程称为『自旋』。优点:由于自旋等待锁的过程线程并不会引起上下文切换,因此比较高效;缺点:自旋等待过程线程一直占...原创 2018-05-12 10:26:25 · 273 阅读 · 0 评论 -
Java并发容器大合集
概述 java.util包中的大部分容器都是非线程安全的,若要在多线程中使用容器,你可以使用Collections提供的包装函数:synchronizedXXX,将普通容器变成线程安全的容器。但该方法仅仅是简单地给容器使用同步,效率很低。因此并发大师Doug Lea提供了java.util.concurrent包,提供高效的并发容器。并且为了保持与普通的容器的接口一致性,仍然使用ut...原创 2018-05-12 10:29:08 · 807 阅读 · 3 评论 -
Java并发编程的艺术(二)——重排序
当我们写一个单线程程序时,总以为计算机会一行行地运行代码,然而事实并非如此。什么是重排序?重排序指的是编译器、处理器在不改变程序执行结果的前提下,重新排列指令的执行顺序,以达到最佳的运行效率。重排序分类重排序分为:编译器重排序 和 处理器重排序。数据依赖编译器和处理器并不会随意的改变指令的执行顺序,因为有些指令之间是有依赖关系的,若改变了他们的执行顺序,就会出现错误的结果。 因此,编译器和处理器只...原创 2018-03-19 15:35:01 · 373 阅读 · 0 评论 -
Java并发编程的艺术(三)——volatile
1. 并发编程的两个关键问题并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行;但往往多条线程之间需要共享数据,此时在并发编程过程中就不可避免要考虑两个问题:通信 与 同步。通信 通信是指消息在两条线程之间传递。 既然要传递消息,那接收线程 和 发送线程之间必须要有个先后关系,此时就需要用到同步。通信和同步是相辅相成的。同步 同步是指,控制多条线程之间的执行次序...原创 2018-03-19 15:34:13 · 351 阅读 · 0 评论 -
MySQL并发学习——锁(行锁、表锁、页锁、乐观锁、悲观锁等)
原创 2018-03-16 23:33:02 · 593 阅读 · 0 评论 -
理解CAS算法在JAVA中的作用
原创 2018-03-18 22:11:11 · 827 阅读 · 0 评论 -
Java并发编程的艺术(十一)——线程池(2)
Executor两级调度模型 在HotSpot虚拟机中,Java中的线程将会被一一映射为操作系统的线程。 在Java虚拟机层面,用户将多个任务提交给Executor框架,Executor负责分配线程执行它们; 在操作系统层面,操作系统再将这些线程分配给处理器执行。Executor结构 Executor框架中的所有类可以分成三类:任务 任务有两种类型:Runnable和Callable。任务执行器 ...原创 2018-03-19 15:26:50 · 310 阅读 · 0 评论 -
Java并发编程的艺术(九)——批量获取多条线程的执行结果
当向线程池提交callable任务后,我们可能需要一次性获取所有返回结果,有三种处理方法。方法一:自己维护返回结果// 创建一个线程池ExecutorService executorService = Executors.newFixedThreadPool(10);// 存储执行结果的ListList<Future<String>> results = new A...原创 2018-03-19 15:28:23 · 372 阅读 · 1 评论 -
Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解
1. 闭锁:CountDownLatch1.1 使用场景若有多条线程,其中一条线程需要等到其他所有线程准备完所需的资源后才能运行,这样的情况可以使用闭锁。1.2 代码实现// 初始化闭锁,并设置资源个数CountDownLatch latch = new CountDownLatch(2);Thread t1 = new Thread( new Runnable(){ public ...原创 2018-03-19 15:29:33 · 304 阅读 · 0 评论 -
Java并发编程的艺术(七)——Executors
Executors框架简介Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逸出。E...原创 2018-03-19 15:30:35 · 264 阅读 · 0 评论 -
Java并发编程的艺术(六)——线程间的通信
多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同。1. volatile、synchronized关键字PS:关于volatile的详细介绍请移步至:Java并发编程的艺术(三)——volatile1.1 如何实现通信?这两种方式都采用了同步机制实现多条线程间的数据通信。与其说是“通信”,倒不如说是“共享变量”来的恰当。当一个共享变量被volatile修饰 或...原创 2018-03-19 15:31:20 · 476 阅读 · 1 评论 -
Java并发编程的艺术(五)——中断
什么是中断?在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupted方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的标识位...原创 2018-03-19 15:32:06 · 346 阅读 · 0 评论 -
Java并发编程的艺术(四)——线程的状态
线程的状态初始态:NEW创建一个Thread对象,但还未调用start()启动线程时,线程处于初始态。运行态:RUNNABLE在Java中,运行态包括就绪态 和 运行态。就绪态 该状态下的线程已经获得执行所需的所有资源,只要CPU分配执行权就能运行。所有就绪态的线程存放在就绪队列中。运行态 获得CPU执行权,正在执行的线程。由于一个CPU同一时刻只能执行一条线程,因此每个CPU每个时刻只有一条运行...原创 2018-03-19 15:33:20 · 326 阅读 · 1 评论 -
什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
什么是死锁死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。例如,在某一个计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。死锁产生...原创 2018-05-19 10:26:56 · 1460 阅读 · 0 评论