Java多线程
文章平均质量分 82
tianya3530
这个作者很懒,什么都没留下…
展开
-
Java多线程1:进程与线程概述
进程和线程谈到多线程,就得先讲进程和线程的概念。进程进程可以理解为受操作系统管理的基本运行单元。360浏览器是一个进程、WPS也是一个进程,正在操作系统中运行的".exe"都可以理解为一个进程线程进程中独立运行的子任务就是一个线程。像QQ.exe运行的时候就有很多子任务在运行,比如聊天线程、好友视频线程、下载文件线程等等。 为什么要使转载 2017-01-03 11:21:45 · 267 阅读 · 0 评论 -
Java多线程17:中断机制
概述之前讲解Thread类中方法的时候,interrupt()、interrupted()、isInterrupted()三个方法没有讲得很清楚,只是提了一下。现在把这三个方法同一放到这里来讲,因为这三个方法都涉及到多线程的一个知识点----中断机制。Java没有提供一种安全、直接的方法来停止某个线程,而是提供了中断机制。中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个转载 2017-01-03 11:31:42 · 441 阅读 · 0 评论 -
Java多线程18:线程池
使用线程池与不使用线程池的差别先来看一下使用线程池与不适应线程池的差别,第一段代码是使用线程池的:public static void main(String[] args){ long startTime = System.currentTimeMillis(); final List l = new LinkedList(); ThreadPool转载 2017-01-03 11:32:15 · 279 阅读 · 0 评论 -
Java多线程19:定时器Timer
前言定时/计划功能在Java应用的各个领域都使用得非常多,比方说Web层面,可能一个项目要定时采集话单、定时更新某些缓存、定时清理一批不活跃用户等等。定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程方式进行处理,所以它和多线程技术关联还是相当大的。那和ThreadLocal一样,还是先讲原理再讲使用,Timer的实现原理不难,就简单扫一下就好了。转载 2017-01-03 11:32:49 · 278 阅读 · 0 评论 -
Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger
前言在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码。之前讲过的线程池、BlockingQueue都是在java.util.concurrent下的组件,Timer虽然不在java.util.concurrent下,但也算是。后两篇文章将以例子的形式简单转载 2017-01-03 11:33:22 · 283 阅读 · 0 评论 -
Java多线程21:多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask
CyclicBarrier接着讲多线程下的其他组件,第一个要讲的就是CyclicBarrier。CyclicBarrier从字面理解是指循环屏障,它可以协同多个线程,让多个线程在这个屏障前等待,直到所有线程都达到了这个屏障时,再一起继续执行后面的动作。看一下CyclicBarrier的使用实例:public static class CyclicBarrierThread ex转载 2017-01-03 11:33:55 · 335 阅读 · 0 评论 -
Java中Unsafe类详解
java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:1、通过Unsafe类可以分配内存,可以释放内存;类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应。2、可以定位对象某字段的内存位置,也可转载 2017-01-09 15:07:54 · 549 阅读 · 0 评论 -
学习笔记 02 --- Java多线程
学习笔记(20170106)--- Java多线程 02学习笔记(20170105)---Java多线程 01synchronized关键字:脏读:在多线程中,难免会出现多个线程对同一个对象的实例变量进行并发操作的情况,如果没有同步处理,那么就会造成脏读,最后的结果是不正确的。synchronized获取的锁都是对象锁,而不是把一段代码或者方法当原创 2017-01-10 10:14:25 · 551 阅读 · 0 评论 -
学习笔记 03 --- JUC原子类
学习笔记 03 --- JUC包JUC ------- Java.util.concurrent包:Java 5 之后添加了一个新的包JUC 包到Java平台,JUC包包含许多线程安全、测试良好、高性能的并发构建块。不客气地说,创建JUC 的目的就是要实现 Collection 框架对数据结构所执行的并发操作。通过提供一组可靠的、高性能并发构建块,开发人员可以提原创 2017-01-11 09:48:40 · 630 阅读 · 0 评论 -
学习笔记 06 --- JUC锁
学习笔记 06 --- JUC锁ReadWriteLock和ReentrantReadWriteLock:JUC包中的锁包括“独占锁”和“共享锁”,ReentrantLock就是典型的独占锁。JUC包中的共享锁包括CountDownLatch, CyclicBarrier, Semaphore, ReentrantReadWriteLock等。ReentrantRead原创 2017-01-16 10:30:21 · 600 阅读 · 0 评论 -
学习笔记 04 --- JUC锁
学习笔记 04 --- JUC包之锁同步锁:通过synchronized关键字来进行同步,实现竞争资源的互斥访问的锁。同步锁的原理是对于每一个对象,有且仅有一个同步锁,不同的线程能共同访问该同步锁,但是在同一个时间点,该同步锁能且只能被一个线程获取到。这样,获取到同步锁的线程就能进行CPU调度;而没有获取到同步锁的线程,必须进行等待,知道获取到同步锁之后才能继续运行。原创 2017-01-12 10:23:03 · 553 阅读 · 0 评论 -
学习笔记 05 --- JUC锁
学习笔记 05 --- JUC锁LockSupport:LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport通过unsafe函数中的接口来实现阻塞和解除阻塞的,AQS和其他的lock都会使用到这个基础类。LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程(park()---获取许可,u原创 2017-01-13 09:55:50 · 1042 阅读 · 0 评论 -
学习笔记 07 --- JUC集合
学习笔记 07 --- JUC集合在讲JUC集合之前我们先总结一下Java的集合框架,主要包括Collection集合和Map类,Collection集合又可以划分为LIst和Set。1. List的实现类主要有: LinkedList, ArrayList, Vector, Stack。(01) LinkedList是双向链表实现的双端队列;它不是线程安全的,只适原创 2017-01-20 10:35:33 · 3515 阅读 · 1 评论 -
Java并发编程与技术内幕:线程池深入理解
林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka 摘要: 本文主要讲了Java当中的线程池的使用方法、注意事项及其实现源码实现原理,并辅以实例加以说明,对加深Java线程池的理解有很大的帮助。 首先,讲讲什么是线程池?照笔者的简单理解,其实就是一组线程实时处理休眠状态,等待唤醒执行。那么为什么要转载 2017-01-06 19:50:18 · 384 阅读 · 0 评论 -
Java多线程16:线程组
线程组可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示: 线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织。 线程关联线程组:1级关联所谓1级关联就是父对象中有子对象,但并不创建孙对象。这种情况在开发中很常见,比如创建一些线程时,转载 2017-01-03 11:31:03 · 620 阅读 · 0 评论 -
Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
Queue是什么队列,是一种数据结构。除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的。无论使用哪种排序方式,队列的头都是调用remove()或poll()移除元素的。在FIFO队列中,所有新元素都插入队列的末尾。 Queue中的方法Queue中的方法不难理解,6个,每2对是一个也就是总共3对。看一下JDK API就知道了:转载 2017-01-03 11:30:29 · 511 阅读 · 0 评论 -
Java多线程2:Thread中的实例方法
Thread类中的方法调用方式:学习Thread类中的方法是学习多线程的第一步。在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别:1、this.XXX()这种调用方式表示的线程是线程实例本身2、Thread.currentThread.XXX()或Thread.XXX()上面两种写法是一样的意思转载 2017-01-03 11:22:46 · 257 阅读 · 0 评论 -
Java多线程3:Thread中的静态方法
Thread类中的静态方法Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程"。为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作。下面来看一下Thread类中的静态方法:1、currentThread()currentThread()方法返回的是对当前正在执行线程对象的引用。看一个重要的例子,然后得出结论:转载 2017-01-03 11:23:33 · 422 阅读 · 0 评论 -
Java多线程4:synchronized锁机制
脏读一个常见的概念。在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的。 多线程线程安全问题示例看一段代码:public class ThreadDomain13{ private int num = 0; publi转载 2017-01-03 11:24:10 · 269 阅读 · 0 评论 -
Java多线程5:synchronized锁方法块
synchronized同步代码块用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间。这种情况下可以尝试使用synchronized同步语句块来解决问题。看一下例子:public class ThreadDomain18{ public void doLongTimeTask()转载 2017-01-03 11:24:47 · 242 阅读 · 0 评论 -
Java多线程6:synchronized锁定类方法、volatile关键字及其他
同步静态方法synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁。看一下例子,注意一下printC()并不是一个静态方法:public class ThreadDomain25{ public synchronized static void printA() { try转载 2017-01-03 11:25:21 · 266 阅读 · 0 评论 -
Java多线程7:死锁
前言死锁单独写一篇文章是因为这是一个很严重的、必须要引起重视的问题。这不是夸大死锁的风险,尽管锁被持有的时间通常很短,但是作为商业产品的应用程序每天可能要执行数十亿次获取锁->释放锁的操作,只要在这数十亿次操作中只要有一次发生了错误,就可能导致程序中发生死锁,并且即使通过压力测试也不可能找出所有潜在的死锁。 死锁一个经典的多线程问题。当一个线程永远地持有转载 2017-01-03 11:25:53 · 222 阅读 · 0 评论 -
Java多线程8:wait()和notify()/notifyAll()
轮询线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作。想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处理?一个办法就是,B线程while(i == 10000),这样两个线程之间就有了通信,B线程不断通过轮训来检测i == 10000这个条件。这样可以实现我们的需求,但是也带来了问转载 2017-01-03 11:26:26 · 239 阅读 · 0 评论 -
Java多线程9:ThreadLocal源码剖析
ThreadLocal源码剖析ThreadLocal其实比较简单,因为类里就三个public方法:set(T value)、get()、remove()。先剖析源码清楚地知道ThreadLocal是干什么用的、再使用、最后总结,讲解ThreadLocal采取这样的思路。 三个理论基础在剖析ThreadLocal源码前,先讲一下ThreadLocal的三个理论基础:转载 2017-01-03 11:26:57 · 351 阅读 · 0 评论 -
Java多线程10:ThreadLocal的作用及使用
ThreadLocal的作用从上一篇对于ThreadLocal的分析来看,可以得出结论:ThreadLocal不是用来解决共享对象的多线程访问问题的,通过ThreadLocal的set()方法设置到线程的ThreadLocal.ThreadLocalMap里的是是线程自己要存储的对象,其他线程不需要去访问,也是访问不到的。各个线程中的ThreadLocal.ThreadLocalMap以及转载 2017-01-03 11:27:34 · 882 阅读 · 0 评论 -
Java多线程11:ReentrantLock的使用和Condition
ReentrantLockReentrantLock,一个可重入的互斥锁,它具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。 ReentrantLock基本用法先来看一下ReentrantLock的基本用法:public class ThreadDomain38{ private Lock转载 2017-01-03 11:28:08 · 323 阅读 · 0 评论 -
Java多线程12:ReentrantLock中的方法
公平锁与非公平锁ReentrantLock有一个很大的特点,就是可以指定锁是公平锁还是非公平锁,公平锁表示线程获取锁的顺序是按照线程排队的顺序来分配的,而非公平锁就是一种获取锁的抢占机制,是随机获得锁的,先来的未必就一定能先得到锁,从这个角度讲,synchronized其实就是一种非公平锁。非公平锁的方式可能造成某些线程一直拿不到锁,自然是非公平的了。看一下例子,new Reentrant转载 2017-01-03 11:28:41 · 226 阅读 · 0 评论 -
Java多线程13:读写锁和两种同步方式的对比
读写锁ReentrantReadWriteLock概述大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务),但是效率非常低。所以在JDK中提供了一种读写锁ReentrantReadWriteLock,使用它可以加快运行效率。读写锁表示两个锁,一个是读操作相关的锁,称为共享锁;另一个是写操作转载 2017-01-03 11:29:19 · 348 阅读 · 0 评论 -
Java多线程14:生产者/消费者模型
什么是生产者/消费者模型一种重要的模型,基于等待/通知机制。生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点:1、生产者生产的时候消费者不能消费2、消费者消费的时候生产者不能生产3、缓冲区空时消费者不能消费4、缓冲区满时生产者不能生产生产者/模型作为一种重要的模型转载 2017-01-03 11:29:58 · 254 阅读 · 0 评论 -
学习笔记 08 --- JUC线程池
学习笔记 08 --- JUC线程池ThreadPoolExecutor原创 2017-01-23 15:37:14 · 748 阅读 · 0 评论