- 博客(17)
- 资源 (3)
- 收藏
- 关注
原创 AQS实现分析
下文将从实现角度分析AQS是如何完成线程同步,主要包括:同步队列、独占式同步状态获取与释放、共享式同步状态获取与释放、超时获取同步状态等AQS的核心数据结构模板方法。同步队列AQS依赖同步队列(一个FIFO双向队列)来完成同步状态的管理。当前线程获取同步状态失败时,AQS会将当前线程以及等待状态等信息构造成一个节点(Node)并且将其加入到同步队列中,同时会阻塞当前线程,当同步状态释放时,会把首节点
2017-01-23 17:40:32 8355 1
原创 Lock接口与Synchronized关键字的区别
首先,Lock接口与Synchronized关键字都能提供相同的同步功能,只是Lock接口在使用时,需要显示地获取和释放锁。从而使Lock接口没有像Synchronized关键字那样隐式获取锁来的便捷,然而,Lock接口可以拥有获取锁和释放锁的可操作性、可中断的获取锁以及超时获取锁等多种Synchronized关键字不具备的特性。具体如下: 特性 描述 尝试非阻塞地获取锁 当前线程尝试
2017-01-23 15:37:59 1330
原创 ThreadLocal作用与实现
ThreadLocal用于提供线程内部的局部变量,这些变量与它们的正常对象不同,每个线程访问一个单独属于自己的,独立的变量的初始副本。对于ThreadLocal中那些希望将状态与线程相关联的静态字段,通常是private的,例如 用户Id或者事务ID。例如,下面的类为每个线程生成一个本地唯一标识符,线程的id是在第一次调用ThreadId.get()时分配的,并在后续调用中保持不变。public c
2017-01-22 18:07:00 1812
原创 Thread.join()的使用
如果一个线程A执行了thread.join()方法,表示,当前线程A等待thread线程终止之后才从thread.join()返回。线程Thread除了提供join()方法之外,还提供了join(long millis)和join(long millis,int nanos)两个具备超时特性的方法。如果线程thread在给定的超时时间里没有终止,那么将会从该超时方法中返回。public class
2017-01-20 15:18:53 4127
原创 多线程的等待/通知机制
等待/通知机制,是指一个线程A调用了对象O的wiat方法进入等待状态,而另一个线程B调用了对象O的notify或者notifyAll方法,线程A收到通知后从对象O的wait方法返回,进而执行后续操作。等待/通知的实例分析在下面的代码中,创建两个线程,WaitThread和NotifyThread。WaitThread负责检查flag是否为false,如果符号要求,则进行后续操作,否则在lock上等待
2017-01-19 18:06:39 2923 1
原创 Daemon线程
Daemon线程是一种支持型线程,因为它主要用作程序中后台调度已经支持性工作。当一个JVM中不存在非daemon线程的时候,JVM将会退出。可以通过Thread.setDaemon(true)将线程设置位Daemon线程。但是必须在启动线程之前设置,不能在启动线程后设置。在构建Daemon线程时,不能依靠finally块中的内容来确保执行关闭或者清理资源的逻辑。因为Daemon线程一终止,JVM就会
2017-01-18 14:10:10 339
原创 线程的状态
状态名称 说 明 NEW 初始状态,线程被构建,但是还没有调用start方法 RUNNABLE 运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行中” BLOCKED 阻塞状态,表示线程阻塞于锁 WAITING 等待状态,表示线程进入等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或中断) TIME_WAITING 超时
2017-01-18 14:04:26 372
原创 Java内存模型
基础概念 在并发编程中,需要处理两个关键的问题: 1. 线程之间如何通讯 2. 线程之间如何同步 在命令式编程中,线程通讯有两种方式: 1. 共享内存 2. 消息传递在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态,进行隐式通讯在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息进行显式通讯 在共享内存模型中,
2017-01-16 18:01:32 317
原创 Java对象在虚拟机中的创建过程
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用。并且检查代表这个符号引用的类是否已经被加载、解析和初始化过。如果没有,那么必须先执行相应的类加载。在类加载检查通过后,接下来虚拟机将会为新生的对象分配内存。对象所需的内存大小在类加载完成后就可以确定。如果Java堆中的内存是规整的,使用的内存在一边,空闲的内存在另外一边,中间放着一个指针作为临界点的指示器,
2017-01-06 16:34:31 1045
原创 JVM内存区域
Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。下面详细阐述各数据区所存储的数据类型。程序计数器(Program Counter Register)一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变该计
2017-01-06 16:30:47 246
原创 偏向锁和轻量级锁
偏向锁为了让线程获取锁的代价减少,从而引入了偏向锁。当一个线程访问同步块并获取锁的时候,会在对象头和栈帧中的琐记录里存储锁偏向的线程ID,以后线程在进入同一个同步块时,不需要进行CAS操作,来加锁和解锁。只需简单的测试对象头的Mark Word里是否存储这指向当前线程的偏向锁。如果测试成功,表示线程已经获得锁。如果测试失败,需要再次测试对象头的Mark Word里的偏向锁标识是否设置为1(表示
2017-01-05 17:57:50 1285 1
原创 原子操作的实现与原理
在java中可以通过锁和CAS操作来实现原子操作CAS实现原子操作CAS自旋的基本思路是:循环进行CAS操作,直到成功为止下面代码演示了非线程安全的计数器和采用CAS操作的线程安全计数器public class Counter { private AtomicInteger actomicI = new AtomicInteger(0); private int i = 0;
2017-01-05 16:20:22 565
原创 Synchronized的实现与原理
此文乃《Java并发编程的艺术》读书笔记。购买链接实现的基础 java中的每一个对象都可以作为锁 其表现形式为: 1.对于普通同步方法,锁是当前类的实例对象 2.对于静态同步方法,锁是当前类的Class对象 3.对于同步代码块,锁是synchronized括号里配置的对象synchronized在JVM的实现 JVM基于进入和退出Monitor对象来实现方法同步和代
2017-01-05 11:30:17 571
原创 volatile原理与作用
此文乃《java并发编程的艺术》读书笔记。购买链接 同时参考文章:Java 理论与实践: 正确使用 Volatile 变量定义 java编程语言允许线程之间共享变量,为了保证共享变量能够被准确和一致的更新,那么线程应该确保通过排他锁单独获得这个变量。Volatile的实现原理 处理器为了提高处理速度,不直接和内存进行通讯,而是先将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作
2017-01-04 18:58:59 873
原创 线程的优先级
现在操作系统基本采用时分的形式调度运行的线程,操作系统会分出一个个时间片,线程会分配到若干的时间片,当线程的时间片用完了,就会执行发生线程调度,并等待这下次时间片的分配。线程分配到的时间片的多少,直接决定了线程占用cpu资源的多少,而线程优先级则决定了线程需要多或者少分配cpu资源的属性。线程通过setPriority方法进行优先级的设定: public final void setPrior
2017-01-04 16:51:53 463
原创 中断线程的办法
我们知道调用Thread的interrupt方法,并不能真正中断线程,只是给线程做了个中断的状态标记,那么如何中断线程呢?先看如下的代码:public class MyThread extends Thread{ @Override public void run() { try { for (int i = 0; i <1000; i++) {
2017-01-04 16:23:47 297
原创 Thread.interrupted()与Thread.isInterrupted()的区别
调用Thread.interrupt()方法并不能真正停止线程,只是在当前线程做了一个中断的状态标志。public class MyThread extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { super.run();
2017-01-04 16:04:30 11517 7
Linux基础命令教程豪华版
2014-01-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人