多线程
多线程
CodingSoldier
这个作者很懒,什么都没留下…
展开
-
Java任务与返回结果Runnable、Callable、Future、FutureTask
在Java中,Runnable、Callable都表示能被线程执行的任务。Runnable有以下缺陷: 1、没有返回值 2、不能抛出checked exceptionCallable接口类似于Runnable,但能返回一个结果,也可以抛出Exception,使用者需要实现call()方法。/** * Callable接口源码 */@FunctionalInterfacepublic interface Callable<V> { /** ...原创 2020-10-30 22:42:51 · 3261 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore、Condition以及AbstractQueuedSynchronizer
CountDownLatch倒数门栓CountDownLatch倒数门栓,它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。CountDownLatch(int count): CountDownLatch类只有一个构造函数,count为倒数的数值。await(): 调用await()方法的线程会被挂起,此线程会等待直到count值为0才继续执行。countDown(): 将count值减一,直到为0时,等待的线程才会被唤起。/** * 用法一:一个线程等待多个线程...原创 2020-10-29 21:53:57 · 263 阅读 · 1 评论 -
JAVA CAS、自旋、乐观锁
CAS全称compare and swap,是“比较并替换”的意思。CAS有3个重要的操作数:内存值(a)、预期值(aExpe)、更新值(aNew),当且仅当预期值与内存值相同,才将内存值改为修改值,否则什么都不做,最后返回成功或失败。下图是“比较并替换”的执行流程。使用synchronized来模拟“比较并替换”的代码是这样的/** * 使用代码模拟CAS */class SimulatedCAS{ private volatile int value; public原创 2020-10-28 22:19:33 · 363 阅读 · 1 评论 -
Java锁ReentrantLock
从Java 5之后,Java可使用Lock实现同步访问。首先说明,Lock并不是用来替代synchronized的。synchronized有以下不足效率低:锁的释放情况少、不能设置锁的超时时间、不能中断正在试图获得锁的线程。不够灵活:加锁、释放锁的时机单一,进入同步同步代码块获取锁,离开释放锁。与synchronized相比Lock可以提供更多高级功能。ReentrantLock的基本使用...原创 2020-10-27 22:34:32 · 310 阅读 · 0 评论 -
synchronized使用与字节码说明
synchronized的作用:被synchronized修饰的方法或者代码块,同一时刻最多只有一个线程执行这段代码。public class SynchronizedDemo { public static final Object LOCK = new Object(); public static void fn1(){ synchronized (LOCK){ System.out.println(Thread.currentThrea原创 2020-10-24 21:52:20 · 684 阅读 · 0 评论 -
ThreadLocal使用与原理
ThreadLocal是一个用于创建线程局部变量的类,使用ThreadLocal创建的变量只能被当前线程访问和修改,其他线程则无法访问和修改。原创 2020-10-24 11:40:28 · 578 阅读 · 0 评论 -
使用ThreadPoolExecutor自定义线程池
线程池(Thread Pool)是一种基于池化思想管理线程的工具。可以想象成把一些线程放到一个“池子”中,统一管理。Java封装了一些线程池给开发者使用1、Executors.newSingleThreadExecutor() 创建一个只有一个线程的线程池2、Executors.newFixedThreadPool(int nThreads) 创建具有指定数量线程数的线程池3、Executors.newCachedThreadPool() 创建一个线程池,线程池中的线程空闲时间超过60秒就...原创 2020-10-21 22:14:01 · 1736 阅读 · 0 评论 -
Java单例模式的多种写法
1、饿汉式class SingletonHunger{ /** * 在类加载的时候就创建实例,即便INSTANCE还没被使用,也创建实例,这种方式叫做饿汉式。 * jvm能保证类加载时线程安全,直接避免了多线程步问题 */ private final static SingletonHunger INSTANCE = new SingletonHunger(); private SingletonHunger() { } pub原创 2020-10-20 21:31:54 · 149 阅读 · 0 评论 -
Java发现死锁
发生死锁有4个必要条件,4个条件缺一不可:1、互斥条件,共享资源在同一时刻只能被一个线程占用。2、保持与请求条件,请求一把锁的时候还保持着另一把锁。3、循环条件,线程的锁之间存在等待环路。4、不剥夺条件,没有外界条件干扰锁的获取与释放。下面是一个死锁的例子class DeadLockDemo implements Runnable{ int flag = 1; static Object lock1 = new Object(); static Objec原创 2020-10-19 22:29:38 · 218 阅读 · 0 评论 -
线程未捕获异常处理器Thread.UncaughtExceptionHandler
public class Test1 { /** * 线程未捕获异常处理器接口 Thread.UncaughtExceptionHandler * 此接口会在线程由于未捕获异常而突然终止时被调用 */ public static class CustomUncaughtExceptionHandler implements Thread.Uncaug...原创 2020-01-10 22:25:45 · 804 阅读 · 0 评论 -
Java线程中断与停止线程
Java虽然提供了thread.stop()方法来停止线程,但已经被标记为@Deprecated(弃用),因为突然停止一个正在运行或挂起的线程是非常危险的,就像突然断电一样,程序还没执行完毕就突然关闭了。正常情况下,当线程的run()方法执行结束,线程就变成了TERMINATED状态,但如果我们想控制线程的停止,该如何做呢?下面来分析当Runnable的run方法有while循环时,该如何在线程外部停止执行while循环的线程。先分析下面的代码 public static void ma原创 2020-10-18 20:55:36 · 1133 阅读 · 0 评论 -
线程的状态
线程总共有6中状态,分别是:New、Runnable、Blocked、Waiting、Timed Wating、Terminated下面来分析当Runnable的run方法有while循环时,该如何在线程外部停止执行while循环的线程。先看一段代码 public static void main(String[] args) throws Exception{ ...原创 2020-01-10 22:25:19 · 231 阅读 · 0 评论