路漫漫,水迢迢

八十一难拦路七十二变制敌

多线程复习笔记之四【多线程中的异常】

在一个线程组中如果其中一个线程执行报错并不影响其他线程的继续执行,例如: package com.fyw.thread.lock.exception; public class MyThread extends Thread { private String num; public ...

2018-12-16 23:54:17

阅读数:725

评论数:1

多线程复习笔记之三【多线程中的Lock使用】

Lock 1、getHoldCount() 查询当前线程保持此锁锁定的个数,也就是调用lock方法的次数 2、int getQueueLength 返回正等待此锁定的线程估计数,例如有5个线程,1个线程首先执行await,那么调用getQueueLength返回4 3、int getWa...

2018-12-16 23:00:59

阅读数:645

评论数:0

多线程复习笔记之二【线程间的通信】

Object.wait:释放锁,当时代码不会往下继续执行,需要等待notify通知,wait(1000)超过1秒自动唤醒 Object.notify:不释放锁,需要等到同步代码块执行完毕,如果没有wait线程,notify命令将被忽略。 condition 如果有多个线程处于等待状态,我想唤...

2018-12-15 17:53:51

阅读数:65

评论数:0

多线程复习笔记之一【关键属性与常用关键字概述】

1、并发和并行的区别? 并发可以发生在一个或多个CPU,同时处理多个任务,多个任务之间可以进行切换执行;并行只能发生在多核CPU,一核对应一个任务同时运行 2、线程和进程之间的区别? a) 一个程序至少有一个进程,一个进程至少有个线程 b) 进程在执行过程中拥有独立的内存单元,线程之间的内...

2018-12-15 17:47:40

阅读数:60

评论数:0

多线程设计模式:Master-Worker模式

Master-Worker是常用的并行计算模式。它的核心思想是系统由两类进程协作工作:Master进程和Worker进程。Master负责接收和分配任务,Worker负责处理子任务。当各个Worker子进程处理完成后,会将结果返回给Master,由Master作归纳总结。其好处就是能将一个大任务分...

2018-11-21 22:31:19

阅读数:52

评论数:0

java定时器之Timer使用与原理分析

Timer和TimerTask Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。 TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。 【使用举例】 【sch...

2018-11-07 16:10:15

阅读数:75

评论数:1

synchronized的底层优化

Synchronized底层是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchron...

2018-11-06 23:25:27

阅读数:724

评论数:0

ReentrantLock原理

ReentrantLock主要利用CAS+AQS队列来实现。它支持公平锁和非公平锁,两者的实现类似。 CAS:Compare and Swap,比较并交换。CAS有3个操作数:内存值V、预期值A、要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。该操作是一个原...

2018-11-04 20:18:23

阅读数:75

评论数:1

线程间的通信wait与notify

wait()方法 wait()方法使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法。 当前的线程必须拥有当前对象的monitor,也即lock,就是锁。 线程调用wait()方法,释放它对锁的拥有权,然后等待另外的线程来通知它(通知的方式是notif...

2018-10-31 22:48:09

阅读数:571

评论数:0

Java中的自旋锁

自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。  获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。 Java如何实现自...

2018-10-25 22:20:41

阅读数:255

评论数:1

volatile的原理和使用场景

上下文切换 CPU为每个线程分配时间片(几十ms),CPU不断切换线程执行,切换的时候会记录状态,保证能够从原来的状态继续执行。当然上下文切换是有开销的,当线程执行时间非常短时我们用并发可能会耗时更久。使用【Lmbench3】和【vmstat】可以测量上下文切换的时间和次数。 为了降低开销我们...

2018-07-11 22:08:42

阅读数:191

评论数:0

如何利用Redis分布式锁实现控制并发

redis命令解释说道Redis的分布式锁都是通过setNx命令结合getset来实现的,在讲之前我们先了解下setNx和getset的意思,在redis官网是这样解释的 注:redis的命令都是原子操作SETNX key value将 key 的值设为 value ,当且仅当 key 不存在。...

2017-06-05 18:39:33

阅读数:9195

评论数:2

Java多线程中FutureTask详解与正式环境问题定位

通过FutureTask的源码我们可以看到FuturenTask类实现了RunnableFuture接口,继承了Runnable和Future接口。 public class FutureTask implements RunnableFuture public interface Runn...

2017-05-27 18:51:00

阅读数:1253

评论数:0

Java线程Executor框架详解与使用

在HotSpot VM的线程模型中,Java线程被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个操作系统线程也会被回收,在JVM中我们可以通过-Xss设置每个线程的大小。操作系统会调度所有线程并将它们分配给可用的CPU。 在上层,Java...

2017-05-26 22:55:29

阅读数:4038

评论数:0

Java线程池(ThreadPoolExecutor)原理分析与使用

在我们的开发中“池”的概念并不罕见,有数据库连接池、线程池、对象池、常量池等等。下面我们主要针对线程池来一步一步揭开线程池的面纱。使用线程池的好处1、降低资源消耗 可以重复利用已创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度 当任务到达时,任务可以不需要等到线程创建就能立即执行。...

2017-05-25 21:52:32

阅读数:6995

评论数:4

Java中的常用阻塞队列源码分析

定义支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用...

2017-05-24 21:46:25

阅读数:1887

评论数:0

Java并发中的ConcurrentLinkedQueue源码分析

本文中多次提到CAS算法,先做个CAS算法的简单描述CAS(非阻塞算法)说明CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 ConcurrentLinkedQueue是一种线程安全的队列。他是使用非阻塞算法(CA...

2017-05-23 21:42:44

阅读数:2335

评论数:2

ConcurrentHashMap原理详解

ConcurrentHashMap是既高效又线程安全的HashMapHashTable和ConcurrentHashMap区别HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法,...

2017-05-22 21:30:43

阅读数:724

评论数:0

Java多线程Condition接口原理详解

Condition接口提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的 Condition接口详解Condition定义了等待/通知两种类型的方法,当前线程调用这些方法时,需要提前获取到Condition对象关联的锁。Con...

2017-05-21 19:15:23

阅读数:3729

评论数:3

Java多线程读写锁ReentrantReadWriteLock原理详解

ReentrantLock属于排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个线程访问,但是在写线程访问时,所有的读和其他写线程都被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。 下面我们来看看读写锁Ree...

2017-05-21 11:58:45

阅读数:3837

评论数:2

提示
确定要删除当前文章?
取消 删除