java多线程
文章平均质量分 85
九月木码
这个作者很懒,什么都没留下…
展开
-
Java多线程11:ReentrantLock的使用和Condition
ReentrantLock ReentrantLock,一个可重入的互斥锁,它具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。ReentrantLock基本用法public class ThreadDomain38{ private Lock lock = new ReentrantLock(); ...原创 2018-12-26 15:05:00 · 134 阅读 · 0 评论 -
Java多线程3:Thread中的静态方法
Thread类中的静态方法 Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程"。为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作。下面来看一下Thread类中的静态方法:1、currentThread()currentThread()方法返回的是对当前正在执行线程对象的引用。看一个重要的例子,然后得出结论:pu...原创 2018-12-25 15:53:51 · 240 阅读 · 0 评论 -
Java多线程4:synchronized锁机制
脏读 一个常见的概念。在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的。多线程线程安全问题示例看一段代码:public class ThreadDomain13{ private int num = 0; public void ...原创 2018-12-25 16:19:10 · 90 阅读 · 0 评论 -
Java多线程5:synchronized锁方法块
synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间。这种情况下可以尝试使用synchronized同步语句块来解决问题。看一下例子: public class ThreadDomain18{ public void doLongTime...原创 2018-12-25 16:54:32 · 123 阅读 · 0 评论 -
Java多线程6:synchronized锁定类方法、volatile关键字及其他
同步静态方法 Synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁。看一下例子,注意一下printC()并不是一个静态方法:public class ThreadDomain25{ public synchronized static void printA() { try ...原创 2018-12-25 17:23:12 · 115 阅读 · 0 评论 -
Java多线程7:死锁
前言 死锁单独写一篇文章是因为这是一个很严重的、必须要引起重视的问题。这不是夸大死锁的风险,尽管锁被持有的时间通常很短,但是作为商业产品的应用程序每天可能要执行数十亿次获取锁->释放锁的操作,只要在这数十亿次操作中只要有一次发生了错误,就可能导致程序中发生死锁,并且即使通过压力测试也不可能找出所有潜在的死锁。死锁一个经典的多线程问题。 当一个线程永远地持有...原创 2018-12-25 17:33:24 · 103 阅读 · 0 评论 -
死锁的必要条件和解决方法
什么是死锁 在多道程序设计环境中,若干进程往往要共享这类资源,而且一个进程所需要的资源不止一个。这样,就会出现若干进程竞争有限资源,又推进顺序不当,从而构成无限期循环等待的局面。这种状态就是死锁。系统发生死锁现象不仅浪费大量的系统资源,甚至导致整个系统崩溃,带来灾难性后果。所以,对于死锁问题在理论上和技术上都必须给予高度重视。 死锁是进程死锁的简称,是由Dijkst...原创 2018-12-25 19:10:25 · 4310 阅读 · 0 评论 -
Java多线程8:wait()和notify()/notifyAll()
轮询线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作。想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处理?一个办法就是,B线程while(i == 10000),这样两个线程之间就有了通信,B线程不断通过轮询来检测i == 10000这个条件。这样可以实现我们的需求,但是也带来了问题:CPU把...原创 2018-12-25 19:27:43 · 155 阅读 · 0 评论 -
Java多线程9:ThreadLocal源码剖析
除了控制访问外 我们还可以通过增加资源来保证所有对象的线程安全。如果说锁是第一种思路那么ThreadLocal就是第二种思路了。threadLocal是一个线程局部变量的类,使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。(线程安全,可以使用threadLocal为每一个线程都产生一个实例。保证这些对象只被当前线程所访问。)ThreadLoca...原创 2018-12-26 10:45:21 · 120 阅读 · 0 评论 -
Java多线程10:ThreadLocal的作用及使用
从上一篇对于ThreadLocal的分析来看,可以得出结论:ThreadLocal不是用来解决共享对象的多线程访问问题的,通过ThreadLocal的set()方法设置到线程的ThreadLocal.ThreadLocalMap里的是线程自己要存储的对象,其他线程不需要去访问,也是访问不到的。各个线程中的ThreadLocal.ThreadLocalMap以及ThreadLocal....原创 2018-12-26 11:10:00 · 115 阅读 · 0 评论 -
根据CPU密集型与IO密集型进程来控制线程池中的线程数量
CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。 在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU...原创 2019-05-17 14:13:19 · 2166 阅读 · 0 评论 -
Java多线程2:Thread中的实例方法
Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步。在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别:1、this.XXX() 这种调用方式表示的线程是线程实例本身2、Thread.currentThread.XXX()或Thread.XXX() ...原创 2018-12-25 15:22:44 · 129 阅读 · 0 评论 -
Java多线程1:进程与线程概述
进程和线程一、进程的定义 进程:指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成的,是一个能独立运行的活动实体。 进程可以理解为受操作系统管理的基本运行单元。360浏览器是一个进程、WPS也是一个进程,正在操作系统中运行的".exe"都可以理解为一个进程。 进程一般有三个状态:就绪状态、执行状态和等待状态【或称阻塞...原创 2018-12-25 14:29:41 · 431 阅读 · 0 评论 -
Java多线程18:定时器Timer
前言 定时/计划功能在Java应用的各个领域都使用得非常多,比方说Web层面,可能一个项目要定时采集话单、定时更新某些缓存、定时清理一批不活跃用户等等。定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程方式进行处理,所以它和多线程技术关联还是相当大的。那和ThreadLocal一样,还是先讲原理再讲使用,Timer的实现原理不难,就简单扫一下就好了。...原创 2018-12-27 10:10:44 · 128 阅读 · 0 评论 -
Java多线程12:ReentrantLock中的方法
公平锁与非公平锁 ReentrantLock有一个很大的特点,就是可以指定锁是公平锁还是非公平锁,公平锁表示线程获取锁的顺序是按照线程排队的顺序来分配的,而非公平锁就是一种获取锁的抢占机制,是随机获得锁的,先来的未必就一定能先得到锁,从这个角度讲,synchronized其实就是一种非公平锁。非公平锁的方式可能造成某些线程一直拿不到锁,自然是非公平的了。看一下例子,new Ree...原创 2018-12-26 15:33:56 · 89 阅读 · 0 评论 -
Java多线程13:读写锁和两种同步方式的对比
读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务),但是效率非常低。所以在JDK中提供了一种读写锁ReentrantReadWriteLock,使用它可以加快运行效率。 读写锁表示两个锁,一个是读操作相关的锁,称为共享...原创 2018-12-26 16:14:08 · 127 阅读 · 0 评论 -
Java多线程14:生产者/消费者模型
什么是生产者/消费者模型一种重要的模型,基于等待/通知机制。生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点:生产者生产的时候消费者不能消费 消费者消费的时候生产者不能生产 缓冲区空时消费者不能消费 缓冲区满时生产者不能生产由于缓冲区是临界资源,它只允许一个生产者放入消息,也只允许一个消费者拿出...原创 2018-12-26 16:31:14 · 182 阅读 · 0 评论 -
生产者消费者问题的几种实现
synchronized实现生产者消费者模型 ReentrantLock实现生产者消费者模型 BlockingQueue实现生产者消费者模型 Semaphore实现生产者消费者模型 生产者消费者问题是一个经典的问题,一般情况下都会使用synchronized关键字来对生产和消费逻辑进行加锁 ,最近学习了下并发编程相关的基础知识,尝试使用其它的几种方法来实现生产者和消费者模型。...原创 2018-12-26 16:47:31 · 572 阅读 · 0 评论 -
Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
Queue是什么 队列,是一种数据结构。除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的。无论使用哪种排序方式,队列的头都是调用remove()或poll()移除元素的。在FIFO队列中,所有新元素都插入队列的末尾。Queue中的方法Queue中的方法不难理解,6个,每2对是一个也就是总共3对。看一下JDK API就知道了:注意...原创 2018-12-26 17:04:10 · 174 阅读 · 0 评论 -
Java多线程16:中断机制
概述 之前讲解Thread类中方法的时候,interrupt()、interrupted()、isInterrupted()三个方法没有讲得很清楚,只是提了一下。现在把这三个方法同一放到这里来讲,因为这三个方法都涉及到多线程的一个知识点----中断机制。 Java没有提供一种安全、直接的方法来停止某个线程,而是提供了中断机制。中断机制是一种协作机制,也就是说通过中断并...原创 2018-12-26 17:32:47 · 175 阅读 · 0 评论 -
Java多线程17:线程池
使用线程池与不使用线程池的差别先来看一下使用线程池与不使用线程池的差别,第一段代码是使用线程池的:public static void main(String[] args){ long startTime = System.currentTimeMillis(); final List<Integer> l = new LinkedList<Inte...原创 2018-12-26 20:03:54 · 308 阅读 · 0 评论 -
Java多线程19:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger
前言 在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码。之前讲过的线程池、BlockingQueue都是在java.util.concurrent下的组件,Timer虽然不在java.util.concurrent下,但也算是。后两篇文章将以例子的...原创 2018-12-27 10:11:00 · 168 阅读 · 0 评论 -
Java多线程20:多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask
CyclicBarrier 接着讲多线程下的其他组件,第一个要讲的就是CyclicBarrier。CyclicBarrier从字面理解是指循环屏障,它可以协同多个线程,让多个线程在这个屏障前等待,直到所有线程都达到了这个屏障时,再一起继续执行后面的动作。看一下CyclicBarrier的使用实例:public static class CyclicBarrierThread...原创 2018-12-27 10:11:16 · 143 阅读 · 0 评论 -
Java中sleep()与wait()区别
1、每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!); wait()方法则是指当前线程让自己暂时退让出同步资源...原创 2018-12-27 10:11:32 · 3059 阅读 · 0 评论 -
Java CompletableFuture 详解
Future是Java 5添加的类,用来描述一个异步计算的结果。你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执行。public class BasicFuture { public static void main(String[] args) throws ExecutionExc...原创 2019-07-17 16:52:11 · 392 阅读 · 0 评论