多线程
丰王十
今天走的路,是你昨天埋下的土。
展开
-
java多线程(一) volatile与synchronized区别
1、锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量原创 2016-03-24 15:03:56 · 518 阅读 · 0 评论 -
java多线程-线程内存模型
1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,而TPS值与程序的并发能力有着非常密切的关系。在讨论Java内存模型和线程之前,先简单介绍一下硬件的效率与一致性。 2.硬件的效率与一致性原创 2017-06-14 13:34:37 · 584 阅读 · 0 评论 -
JVM底层是如何实现synchronized---转
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。 数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家原创 2016-10-17 18:14:02 · 360 阅读 · 0 评论 -
理解 Thread.Sleep 函数
我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会 不会被唤醒?某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0)转载 2016-10-12 17:32:25 · 418 阅读 · 0 评论 -
聊聊并发-Java中的Copy-On-Write容器
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。原创 2016-09-23 10:05:30 · 558 阅读 · 0 评论 -
java多线程基础(4)-调度方式之暂停当前线程方式3-线程休眠(sleep)
休眠是与放弃yield相比是更有力的放弃方式, 放弃只是表示当前线程愿意暂停当前线程,让其他有相同优先级的等待线程有机会获得cpu资源。而进入休眠sleep不同,不管有没有其他线程在等待资源,都进入暂停,这样一来,不只是有相同优先级的线程可以获取到资源,低优先级的线程也可能获取到资源。但是进入休眠的线程仍然拥有它已经获取到的锁,因此,其他需要相同锁的线程会阻塞,即使cpu可用。所以要避免在同步方法原创 2016-07-07 15:02:32 · 1334 阅读 · 0 评论 -
java多线程基础(5)-调度方式之暂停当前线程方式4-连接线程(join)
一个线程可能需要另一个线程的结果,这是很常见的,例如,web浏览器在一个线程中加载html页面,他可能需要生成一个单独的线程来获取页面中的图片来嵌入到页面中。 那么加载html的这个线程,在结束页面的显示之前,可能必须等待加载到所有的图片。java提供了join方法来实现这种情况,它运行一个线程在继续执行前等待另一个线程结束。 public class JoinThreadTest {原创 2016-07-07 15:28:02 · 502 阅读 · 0 评论 -
java多线程基础(3)-调度方式之暂停当前线程方式2-放弃
要让线程放弃资源,第二种方式是主动显示的放弃。java中可以通过代码调用Thread.yeild()静态方法来实现。它的作用是告知虚拟机如果有另外一个线程需要运行,则可以运行该线程,但是有些虚拟机会忽略这种方法。 注意:放弃资源,并不会放弃这个线程所拥有的线程锁,因此,在理想情况下,在线程放弃时不应做任何同步。 一个线程放弃时,如果等待运行的其他线程都因为这个线程拥有的同步资源而阻塞的话,那么原创 2016-07-07 14:30:51 · 765 阅读 · 0 评论 -
java多线程基础(2)-调度方式之暂停当前线程方式1-阻塞
线程阻塞 任何时候线程必须停下来等待它没有的资源时,这个时候线程就会发生阻塞。 要让网络程序中的线程自己放弃cpu控制权,最常见的方式就是对io阻塞。 由于cpu比网络和磁盘快得多,网络程序经常会在等待数据从网络到达或向网络发送数据时发生阻塞现象。即使只阻塞几毫秒,这一点时间也足够其他线程用来完成一些重要的任务。 线程在进入一个同步(synchronized)的方法或代码块时也会阻原创 2016-07-07 10:17:01 · 747 阅读 · 0 评论 -
java多线程基础(1)-由调度方式引入线程各种运行状态
线程的调度方式 所有java虚拟机都有一个线程调度器,用来确定哪个时刻运行哪个线程。 它主要包含2种调度器:抢占式(preemptive)和协作式(cooperative). (1)抢占式(重点): 抢占式调度器确定一个线程正常轮到这个线程的cpu时间用完时,会暂停这个线程,将cpu控制权交给轮到时间的另外一个线程。目前大多数虚拟机都使 用这种方式的线程原创 2016-07-07 09:53:21 · 1180 阅读 · 0 评论 -
Java 内存模型与线程
前言 并发是计算机发展的成就。(并发,同一时段发生;并行,同一时刻发生) 我们知道,早期计算机只能串行的进行运行(最古老的打孔)。而经过多年的发展,计算机可以“同时”做很多事情。但悲剧的是,因为CPU速度和其它设备之间的速度差别太大,比如磁盘IO、网络传输、数据库访问等等,如果不希望CPU在进行这些操作时一直处于等待的状态,就要充分压榨它的性能让它干别的事情。 目前在服务器端,衡原创 2017-08-11 12:29:10 · 287 阅读 · 0 评论