![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
juc
文章平均质量分 56
yan_pengfei
这个作者很懒,什么都没留下…
展开
-
ThreadLocal
常见用途每个线程需要一个对象。工具类。 每个线程需要保存全局变量。让不同方法使用避免参数的传递原理每个线程都有一个 ThreadLocal.ThreadLocalMap threadLocals = null重要方法initalValue该方法会返回当前线程的初始值,这是一个懒加载当调用get方法的时候才会触发 如果线程已经调用过了set方法,不会调用initalValue 通常每个线程只执行一次,除非调用了remove方法 如果不重写方法,默认返回nulls.原创 2021-04-10 18:24:47 · 100 阅读 · 0 评论 -
线程池
线程池的目的固定数量的线程来执行多数的任务,来避免反复创建和销毁线程所带来的的开销问题线程池的启动corePoolSize maxPoolSize keepAliveTime workQueue threadFactory Handler添加线程的规则如果线程数小于corePooSize,即使其他线程处于空闲状态也会创建新的线程 如果线程数大于等于corePooSize小于maxPoolSize,则将任务放入队列 如果队列已满,并且线程数小于maxPoolSize,则创原创 2021-04-10 15:17:27 · 85 阅读 · 0 评论 -
Java死锁的产生到消除
首先看一个必然死锁的例子package com.study.deadlock;public class MustDeakLock implements Runnable { int flag = 1; static Object o1 = new Object(); static Object o2 = new Object(); public static void main(String[] args) { MustDeakLock m1 =原创 2021-04-10 10:28:24 · 99 阅读 · 0 评论 -
JAVA内存模型的原理学习之重排序,可见性,原子性
JVM内存结构 vs JMM内存模型 vs JAVA对象模型JVM内存结构JAVA对象模型JAVA对象自身的存储模型。JVM会给这个类创建一个InstanceKlass,保存在方法区。用来在JVM层展示该Java类。当我们在代码中使用new创建一个对象时,Jvm会创建一个InstanceOopDesc对象,这个对象中包含了对象头以及实例数据JMM(Java Memory Model)Java内存模型是一个规范,如果没有这个规范。不同虚拟机经过重排序之后会导致多线程的执行原创 2021-04-09 20:50:22 · 126 阅读 · 0 评论 -
线程核心之安全和性能
线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时的交替执行和调度,也不需要进行额外的同步或者在调用方法时进行其他的协调工作,调用这个对象的行为都可以得到正确结果,那这个对象是线程安全的。三大安全问题a++读写 死锁 对象发布和初始化方法返回一个private对象 还未完成初始化就把对象提供给外面 在构造函数中未初始化完毕就this赋值 隐式溢出----注册监听事件 构造函数中运行线程线程性能问题上下问切换挂起一个线程,将这个线程在cpu中的状态(上下原创 2021-04-09 13:15:53 · 138 阅读 · 0 评论 -
线程核心之线程属性和线程异常处理
线程属性ID:线程id 从1开始private static synchronized long nextThreadID() { return ++threadSeqNumber;}NAME:线程名称 Thread-public Thread(ThreadGroup group, Runnable target) { init(group, target, "Thread-" + nextThreadNum(), 0);}IS DAEMON:是否是守护线程原创 2021-04-08 23:59:29 · 94 阅读 · 0 评论 -
线程核心之Thread和Object方法详解
wait:会释放锁,那个对象执行wait就会释放那个对象的锁notify:唤醒一个等待锁的线程,实现线程之间的通信notifyAll:唤醒等待锁的所有线程wait ,notify,notifyAll 都是锁级别的操作,而每个Object对象头都有一把锁。所以这些方法放在Object类中wait原理首先从入口集entry set 开始去获取锁 获得了锁 执行wait方法释放锁进入wait set 被唤醒时开始尝试获取锁(线程的状态从waiting变成blockd) 获得锁(抢到原创 2021-04-08 20:38:01 · 238 阅读 · 0 评论 -
线程核心之启动与终止
Start和run的区别public class StartAndRun { public static void main(String[] args) { Runnable runnable = ()->{ System.out.println(Thread.currentThread().getName()); }; runnable.run();//main new Thread(runn.原创 2021-04-08 14:29:55 · 371 阅读 · 0 评论 -
JUC之获取子线程的执行结果Future和Callable
Runable的缺点:没有返回值也不能抛出Checked ExceptionFuture的主要方法get()//get方法的行为取决于Callable任务的状态分五种情况//1 任务正常完成,get立即返回结果//2 任务尚未完成(未开始或进行中),get被阻塞直到任务完成//3 任务被中断,get返回InterruptedException//4 任务被取消,get返回CancellationException//5 任务执行异常,get返回ExecutionExcepti原创 2020-06-14 18:23:40 · 159 阅读 · 1 评论 -
JUC之AQS的学习
AbstractQueuedSynchronizer有了它这个基础类可以方便构建其它的线程协作工具类。AQS三大核心state状态具体含义会根据不同实现的类不同的定义。比如在semaphore里,它表示剩余的许可证数量,在CountDownLatch里表示还需要倒数的数量。 state是被volatile修饰的会被并发的修改。所以所有修改的地方都需要保证线程安全。控制线程抢锁和配合的FIFO队列这个队列用来存放等待的线程。当多个线程来拿锁时,必须有排队机制将那些没能拿到锁的线程串在一原创 2020-06-14 17:12:28 · 173 阅读 · 0 评论 -
JUC之线程协作工具
CountDownLatch倒数门闩流程:倒数结束之前一直处于等待状态,直到倒数结束时,此线程才开始工作。主要方法://构造方法传入倒数次数 public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); }public void coun..原创 2020-06-14 11:36:50 · 166 阅读 · 0 评论 -
JUC之并发容器
古老和过时的容器vector 和Hashtable 都是用synchronized 修饰的方法。同步的HashMap 和 ArrayList可以使用工具类Collections.synchronizedList 和Collections.synchronizedMap 变成同步安全的。synchronized 修饰代码块。ConcurrentHashMap1.7的版本1.8jdk版本相比于几乎模仿了同时代HashMap.常见方法://key和value都不能为nu.原创 2020-06-13 23:11:42 · 177 阅读 · 0 评论 -
JUC之CAS学习和Final的不变性
CAS定义:compare and swapCAS有三个操作数:内存值(现在的值)v,预期值(期望的值)A,要修改的值B,当且仅当期望的值A和现在内存值V相等时,才将内存值修改为B,否则什么都不做。在java中是如何利用cas实现原子操作的?AtomicInteger加载Unsafe工具,用来直接操作内存数据 用volatile修饰value字段,保证可见性缺点:ABA问题,自旋时间过长不变性imutable如果一个对象被创建后,状态就不能被修改那么这个对象一定是线程安全的.原创 2020-06-13 18:32:58 · 167 阅读 · 0 评论 -
juc之atomic的学习
atomic基本类型常见方法public final int get() public final int getAndSet(int newValue)public final int incrementAndGet()public final int decrementAndGet()public final int addAndGet(int delta)//获取当前的值并加上预期的值//如果当前的值和期待值expect相同,则把当前值设置为updatepublic..原创 2020-06-13 16:37:58 · 138 阅读 · 0 评论 -
JUC之Lock的学习
Lock接口的主要方法//尝试获取锁,超时就放弃当前锁boolean tryLock(long time, TimeUnit unit) throws InterruptedException;//相当于把超时时间设置为无限,在等待的过程中,线程可以被打断void lockInterruptibly() throws InterruptedException;//注意不遵守公平原则,会获取到锁不管是否会有其它线程等待boolean tryLock();//最佳实践if (loc原创 2020-06-13 10:40:47 · 161 阅读 · 0 评论