JavaAPI-并发编程总结

目录

目标

JDK版本

Thread状态

共享内存

线程安全

集合

同步锁

线程间协同工作

ThreadLocal

JMM java内存模型


目标

阐述个人对并发编程的认识和总结,让读者可短时间了解并发编程的玩法,使用时游刃有余。

JDK版本

JDK8

Thread状态

NEW

线程没有被开始 a thread which has not yet started

RUNNABLE

正在JVM中执行,但是可能在等待系统资源,如cpu等。

A thread in the runnable state is executing in the Java virtual machine but it may be waiting for other resources from the operating system such as processor.

BLOCKED

等待监视器锁,以便进入同步块/方法 或 当调用完Object.wait()之后重入同步块/方法。
A thread in the blocked state is waiting for a monitor lock to enter a synchronized block/method or
reenter a synchronized block/method after calling {@link Object#wait() Object.wait}.

WAITING

正在等待其他线程执行特定操作
由于执行了如下方法:
Object.wait(),thread.join(),LockSupport.park
例如:当前线程objectA.wait(),是在等待其他线程执行objectA.notify;当前线程join,是在等待特定线程执行结束。
* A thread is in the waiting state due to calling one of the
         * following methods:
         * <ul>
         *   <li>{@link Object#wait() Object.wait} with no timeout</li>
         *   <li>{@link #join() Thread.join} with no timeout</li>
         *   <li>{@link LockSupport#park() LockSupport.park}</li>
         * </ul>
         *
         * <p>A thread in the waiting state is waiting for another thread to
         * perform a particular action.
         *
         * For example, a thread that has called <tt>Object.wait()</tt>
         * on an object is waiting for another thread to call
         * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
         * that object. A thread that has called <tt>Thread.join()</tt>
         * is waiting for a specified thread to terminate.

TIMED_WAITING

在特定的时间内等待其他线程。
由于执行如下方法:
thread.sleep(timeout)
object.wait(timeout)
join(timeout)
LockSupport.parkNanos
LockSupport.parkUntil

TERMINATED

终止的/结束的线程,表示run执行已经结束。

共享内存

可以被多个线程访问的内存空间

线程安全

要求每个时刻,共享变量只能被一个线程操作。

方式

  • 线程封闭
  • 使用排他(同步)锁

判断线程安全,多个线程操作同一个对象的方法时

  •  只要方法中不存在对共享变量的操作,则是安全的。
  •  存在共享变量操作,但已synchronized同步,则安全的。

集合

线程安全的集合HashTable

非线程安全的集合HashMap、HashSet、TreeMap、TreeSet、ArrayList、LinkedList

同步锁

synchronized

  • 对象的隐式monitor
    • Class level monitor
      • static 方法添加synchronized关键字
    • object level monitor
      • object 方法添加synchronized关键字
      • synchronized同步代码块
  • JVM内部的实现原理
  • 分类
    • method level方法级别的同步
      • JVM如何区分同步方法?
        1:method是存储在常量池的METHOD_INFO数据结构(方法表)中,同步方法会被set ACC_SYNCHRONIZED标签。
        2:JVM的方法调用指令(如invokevirtual invokestatic)会判断,如果方法具有ACC_SYNCHRONIZED标签,则让当前线程进入monitor,线程调用方法,当方法结束后,线程退出monitor。
    • JVM指令顺序的同步,即同步代码块
      • 同步代码块被编译为成对的指令:monitorenter与monitorexit
  • 限制条件
    • the number of exits about Thread to Monitor 等于之前发生的 the number of enters about T to M

lock

详见另一篇博文 JavaAPI-Lock-简介

线程间协同工作

Object.wait/notify/notifyall

线程中wait和notify的使用:(对象A指的是同一对象,否则报错)
首先对某个对象A进行synchronized同步
然后对该对象A使用wait和notify

wait 在获取对象A的监听器(锁)的情况下,才可以使用。导致所在线程A将自己放到对象A关联的wait集合中,并释放对象A的所有同步锁,并不可进行线程调度,线程处于等待状态,直到其他持有对象A的监听器的线程B调用了对象A的唤醒操作,线程A将从wait集合中移出并再次竞争锁,然后继续wait后的代码。


notify/notifyAll 在获取对象A的监听器的情况下,才可以使用。将唤醒(一个[如何选择要依赖具体实现机制]或所有)其他的并持有对象A的监听器的线程的wait等待。
 

Thread.join

线程A的执行过程中调用线程B进行协调且等待B执行完毕后A才继续,则B.start(),B.join([可以设置超时])

java.util.concurrent

java.util.concurrent提供的循环栅栏/countdownLatch/lock与condition.await、signal

详见另一篇介绍

ThreadLocal

为当前线程保存特定数据,不与其他线程冲突

涉及的类

  • Thread
  • ThreadLocal
  • ThreadLocalMap ThreadLocal#ThreadLocalMap

ThreadLocalMap使用Entry[]数组保存数据,Entry理解维护threadLocal:value关系

原理

  • 如何存储?
    • Thread内部有个threadlocalmap类型变量,用于存储同一个thread对应不同threadlocal的数据,所以当前线程设置的threadlocal数据其实是保存在该thread内部;
  • 如何取数据?
    • 通过threadlocal.threadlocalhashcode&(entrys.length-1)确定某个local在entry的位置。

JMM java内存模型

详见另一篇介绍

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值