● JAVA 进阶
文章平均质量分 64
你是我世界的光
不念过往,不畏将来。
展开
-
线程简介和线程优先级
1.线程线程:又称轻量级进程,是现代操作系统的最小调度单元。JAVA从诞生开始就明智的选择了内置对多线程的支持。在一个进程中可以创建多个线程,这些线程拥有各自的计数器、堆栈和局部变量等特性,并且能够访问共享的内存变量。在JVM中,我们也可以了解到,程序计数器、虚拟机栈和本地方法栈都是线程私有的。 线程切换与进程切换相比,代价开销较小, 因此能够提高CPU效率。关于进程与线程,推荐阅读原创 2016-07-22 13:59:49 · 8687 阅读 · 2 评论 -
读写锁使用的Demo分析
之前我们提到的锁都是排它锁(同一时刻只允许一个线程进行访问),而读写锁维护了一对锁,一个读锁,一个写锁。读写锁在同一时刻允许多个线程进行读操作,但是写线程访问过程中,所有的读线程和其他写线程均被阻塞。如此,并发性有了很大的提升。这样,在某些读远远大于写的场景中,读写锁能够提供比排它锁更好的并发量和吞吐量。本文源码可在我的github中找到。一个关于读写锁的Demo:分析:设计一个模拟队列,拥有一个d原创 2016-08-10 21:11:21 · 2879 阅读 · 3 评论 -
Condition接口
本文相关源码可以在我的github中找到。 前言: 任何一个JAVA对象都存在一组监视器方法(定义在Object上面),主要包括wait()、notify()等方法,这些方法与synchronized同步关键字配合,可以实现等待/通知模式。而Condition接口也提供了类似的监视器方法,与Lock配合使用可以实现等待/通知模式。Object中监视器方法与Condition接口几点主要不同:原创 2016-08-11 12:43:37 · 1109 阅读 · 0 评论 -
JAVA中的并发工具类(一)----控制并发数的Semaphore
本文使用的Demo可以在我的github中找到。 前面我们使用线程池技术来控制访问资源的线程数目,假设对某一文件的访问,我们允许几十个线程来读他,但是出于某种限制,我们要求只允许10个线程可以同时读该文件。这就好比十字路口有100辆车想要过马路,我们只允许其中的10辆车可以看到绿灯然后让他们通过马路。Semaphore就类似于这种情境下的红绿灯。Semaphore的应用场景:可以用于做流量控制,特原创 2016-08-11 16:23:23 · 3342 阅读 · 1 评论 -
JAVA中的并发工具类(三)---CountDownLatch
CountDownLatch是一个类似计数器一样的东西。 CountDownLatch允许一个或者多个线程等待其他线程完成操作。上篇文章我们提到的CyclicBarrier类提供一个多个线程可见的统一的屏障,等到指定数目的线程到达屏障时,屏障才会消失,而CountDownLatch类有点类似,但是又有点不同。先看一个CountDownLatch的Demo:import java.util.conc原创 2016-08-11 22:14:15 · 401 阅读 · 0 评论 -
JAVA中的并发工具类(二)---同步屏障类CyclicBarrier
本文涉及到的源码可以在我的github找到。CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障点时均被阻塞,只要规定数目的线程都到达该处,然后同时放行。应用场景:多线程计算数据,最后合并结果的场景。例如,用一个Excel保存用户所有银行流水,每个sheet保存一个账户近一年的每笔流水,现在需要统计用户的日均银行流水,先用多原创 2016-08-11 18:49:10 · 449 阅读 · 0 评论 -
JAVA中的并发工具类(四)---线程间交换数据的Exchanger类
本文涉及到的代码可以在我的github中找到。 Exchanger(交换者)是一个用于线程间写作的工具类。它提供一个同步点,在这个同步点,2个线程可以交换彼此的数据。这2个线程通过exchange()方法交换数据。如果第一个线程执行exchange()方法,它会一直等待第二个线程也执行exchange()方法,当2个线程都到达同步点时,这2个线程就可以交换数据,将本线程产生的数据传递给对方。Exc原创 2016-08-11 22:46:28 · 552 阅读 · 0 评论 -
JAVA中的阻塞队列
一.什么是阻塞队列?阻塞队列是一个在队列基础上又支持了两个附加操作的队列。2个附加操作:支持阻塞的插入方法:队列满时,队列会阻塞插入元素的线程,直到队列不满。支持阻塞的移除方法:队列空时,获取元素的线程会等待队列变为非空。二.阻塞队列的应用场景阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列是生产者用来存放元素、消费者获取元素原创 2016-08-13 00:03:55 · 5487 阅读 · 0 评论 -
多线程的编程题目(一)
本文涉及到的代码可以在我的github中找到。题目一:现有一程序中的Test100类中的代码在不断的产生数据,然后交给TestDo.doSome()方法去处理,就好像生产者在不断地产生数据,消费者在不断消费数据。请编写程序模拟10个线程来消费生产者产生的数据,这些消费者调用数据,只有上一一个消费者消费完之后,下一个消费者才能消费数据,保证消费者线程拿到的数据时有序的。拿到题目我们首先不要着急写代码,原创 2016-08-13 14:23:06 · 2431 阅读 · 1 评论 -
JAVA并发机制的底层实现原理
JAVA代码在编译后会变成字节码,字节码被类加载器加载到JVM中,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,JAVA中所使用的并发机制依赖于JVM的实现和CPU的指令。1.volatile的应用volatile是轻量级的synchronized,它只是用来保证共享变量的可见性,不能保证操纵的原子性。1.1—volatile保证共享变量可见性有volatile修饰的变量进行写操作的时候原创 2016-08-10 16:17:09 · 5202 阅读 · 0 评论 -
单例模式
单例模式常见的三种实现方式:1.懒汉式为什么称之为懒汉式,因为这种方式很“懒”,只有当别人向它请求一个对象的时候,它才会产生一个对象供别人使用:package DesignMode;public class SingletonMode{ private static SingletonMode single = null; public static SingletonMode ge原创 2016-09-05 23:18:54 · 266 阅读 · 0 评论 -
生产者与消费者模式
这种设计模式主要的使用场景是JAVA并发中,一个使用阻塞队列实现的Demo(使用链表实现的有界阻塞队列)如下:import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;public class ConsumerAndProducer{ public static vo原创 2016-09-07 10:57:09 · 958 阅读 · 0 评论 -
线程锁---Lock接口技术的简单使用
本文代码可以在我的github中找到。 前面我们讲到了用synchronized关键字对代码块进行同步,我们不难看出,如果将“锁”抽象成一个对象,那么就会使线程锁这种技术更加符合我们面向对象的思想。锁是用来控制多个线程访问共享资源的方式。,JAVA SE 5之前,JAVA程序都是依靠synchronized关键字实现锁功能,在1.5之后,增加了Lock接口以及相关实现类用来实现锁功能,他提供了与s原创 2016-08-09 23:34:54 · 596 阅读 · 0 评论 -
Executor框架的使用简介
类似于我们熟悉的集合框架(由Collection和Map接口衍生出很多其他的接口和类),在JAVA多线程中,也存在一个Executor框架。等以后时间充足了,会对该框架来一波源码剖析。简而言之,Executor框架实现了工作单元与执行单元的分离。本文用到的程序源码请参考我的github。一.Executor框架的两级调度模型 在HotSpot VM的线程模型中,JAVA线程被一对一映射为本地操作原创 2016-08-09 15:05:44 · 5644 阅读 · 0 评论 -
JAVA中的线程池
———————–本文参考《JAVA并发编程的艺术》和JDK1.8。————— JAVA中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行的任务的程序都可以使用线程池。 ->《JAVA并发编程的艺术》1.线程池的好处降低线程创建和销毁造成的资源损耗。提高响应速度:任务到达时,可以装载到线程中执行,而不必等到线程创建完毕。提高线程的可管理性:使用线程池可以进行统一分配、调优原创 2016-08-08 12:31:35 · 413 阅读 · 0 评论 -
线程的创建
线程的创建共有2种方式:1.继承Thread类原创 2016-07-23 12:20:25 · 225 阅读 · 0 评论 -
线程的状态
线程共有五种状态:就绪、运行、等待、阻塞、终止先上个自己画的图:如果有不当的地方敬请指正。有些分类是将等待状态也归入阻塞状态,并且将阻塞状态分为:等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。同步阻塞:即竞争锁失败的线程的状态,此时会进入锁池(即等待竞争锁的线程的集合)。其他阻塞:也就是超时等待状态,超时结束,就会转入就绪状态。原创 2016-07-23 13:20:01 · 374 阅读 · 0 评论 -
关于线程sleep的一个小问题
之前在网上看过一篇博客。就该博客的程序的个人有疑惑的问题这里记录一下。博客的程序是这样的:import java.util.Date;public class testSleep{ public static void main(String[] args) { // 创建并启动线程 MyThread thread = new MyThread();原创 2016-07-25 13:59:19 · 3729 阅读 · 1 评论 -
传统定时器技术
本系列作为学习张孝祥老师系列视频的笔记。Timer是一个用来安排未来任务执行的“幕后”线程,任务可以被安排执行一次,也可以以一定的时间间隔被Timer安排循环执行。Timer类是线程安全的类。注意:Timer类不提供时间实时性的保证,它是使用Object类的wait方法来安排任务的。以上翻译自JDK1.8的文档,原文如下: 使用Timer类的2个程序,其实现的功能是:5秒后开始打印,每隔2秒,4秒原创 2016-07-25 23:21:27 · 331 阅读 · 0 评论 -
传统线程互斥技术初步-synchronized常用的几个锁对象
—————-本系列文章作为学习张孝祥老师系列视频的笔记。—————首先看一个程序:public class TraditionalSynchronizedLock{ public static void main(String[] args) { OutDemo out = new OutDemo(); new Thread(new原创 2016-07-27 13:17:22 · 509 阅读 · 0 评论 -
传统线程通信技术
—————-本系列作为学习张孝祥老师的学习笔记——————-来看这样一个题:子线程循环15次,接着主线程循环50次,接着又回到子线程循环15次,接着再回到主线程50次…如此循环100次,写出程序。程序分析:首先我们将该程序分为2个部分,一是业务逻辑部分,用来做线程内最基本的循环;二是线程控制部分,来控制线程循环100次。基于上面的思想,我们加一个业务逻辑类用来定义业务逻辑。代码如下:/** *原创 2016-07-27 21:00:34 · 361 阅读 · 0 评论 -
JAVA多线程学习---(一)
一个sleep()方法的程序。原文:http://http://blog.csdn.net/wangyuetingtao/article/details/8242343package Thread;import java.util.Date;public class TestSleep { public static void main(String[] args) {原创 2016-03-18 19:28:19 · 414 阅读 · 0 评论 -
线程内部共享变量(ThreadLocal类使用初步)
线程内部共享变量的应用背景介绍:以转账为例,对于同一个转账系统,当有多个线程访问的时候,我们需要为这些线程提供数据库连接(connection),显然此时的connection是线程内共享的。因为,一个单独的线程对应一个用户,当对某个用户的服务完成之后,数据库连接关闭,如果数据库连接线程共享,毫无疑问,此时会对正在转账的其他用户产生影响。一个线程可以对应多个ThreadLocal对象;原创 2016-07-29 17:13:00 · 425 阅读 · 0 评论 -
多线程概述
并发编程的目的是为了让程序运行的更快。但是在很多情况下,由于线程创建和上下文切换上的开销,会导致多线程不一定就比单线程运行的更快。原创 2016-07-20 23:38:40 · 195 阅读 · 0 评论 -
多个线程共享数据的方式
讨论多个线程共享数据,其实就是讨论多个线程如何对同一个数据进行操作。另外,从今天开始,我会将我博客中涉及到的源代码放到我的github中。本文源代码下载:My Tracks方式有很多,这里列出2种:1.每个线程执行的代码相同如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个对象中有那个我们需要共享的数据,例如我们的卖票系统。示例Demo:public class ManyCenjo原创 2016-08-06 00:27:41 · 1240 阅读 · 0 评论 -
死锁Demo
突然想写个死锁Demo了,说不定以后面试用得到,搜了搜网上关于死锁的Demo有很多,不过看起来让人头晕目眩。既然是死锁,我就拿我们最好理解的一种场景来举例,有2把锁lock1和lock2,线程X执行某个代码,拿到了lock1,然后沉睡让出CPU,准备沉睡完毕之后再拿到lock2做些事情。在他睡着的时候,线程Y开始运行也执行某个代码,拿到了lock2,然后也沉睡,准备睡醒之后拿到lock1做些事情。此原创 2016-08-07 00:57:16 · 457 阅读 · 0 评论 -
防止单例模式被攻击的一个Demo
我们要创建的单例的类如下:package DesignMode;public class SingletonMode{ private static volatile SingletonMode single = null; private static boolean flag = true; private SingletonMode() { syn原创 2016-09-07 12:21:35 · 390 阅读 · 0 评论