JAVA线程相关

2020-03-05  本文已影响0人  EmpathyBasic

thread.join() 等待thread线程执行完才继续向下执行代码,但是可以执行之前的线程
Thread.sleep(3000) 线程进入阻塞状态,不会释放锁
thread.yield() 线程进入Runnable(就绪状态),不会释放锁,CPU从就绪状态线程队列中只会选择与该线程优先级相同或者更高优先级的线程去执行。

Synchronized的用法

参考https://www.cnblogs.com/fnlingnzb-learner/p/10335662.html
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
  3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
  4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

volatile

参考https://blog.csdn.net/u012723673/article/details/80682208?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

Java内存模型.png

volatile是Java提供的一种轻量级的同步机制
并发编程的3个基本概念

  1. 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
  2. 可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
  3. 有序性:即程序执行的顺序按照代码的先后顺序执行。

volatile变量的特性

  1. 保证可见性,不保证原子性
    a.当写一个volatile变量时,JMM会把该线程本地内存中的变量强制刷新到主内存中去;
    b.这个写会操作会导致其他线程中的缓存无效。
  2. 禁止指令重排
    a.重排序操作不会对存在数据依赖关系的操作进行重排序。
    b.重排序是为了优化性能,但是不管怎么重排序,单线程下程序的执行结果不能被改变

要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:

a.对变量的写操作不依赖于当前值。
b.该变量没有包含在具有其他变量的不变式中。

这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。事实上就是保证操作是原子性操作,才能保证使用volatile关键字的程序在并发时能够正确执行。

ThreadLocal

参考https://www.jianshu.com/p/3c5d7f09dfbd

ThreadLocal并不是一个Thread,而是用于保存当前线程的变量,ThreadLocalVariable更容易让人理解一些

简单画了一下基本方法,希望以后多画一些流程图或者UML图,方便理解、记忆

ThreadLocal.png
ThreadLocalSynchronized都是为了解决多线程中相同变量的访问冲突问题,不同的点是

正因为ThreadLocal的线程隔离特性,使他的应用场景相对来说更为特殊一些。在android中Looper、ActivityThread以及AMS中都用到了ThreadLocal。当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候,就可以考虑采用ThreadLocal。

Executors线程池

首先介绍一下retry,类似与C语言的goto,在kotlin中是这样使用的

 for (i in 0..9) {
            retry@
            while (i == 5) {
                continue@retry
            }
            print("$i ")
        }

参考https://www.jianshu.com/p/7ab4ae9443b9

Executors.newFixedThreadPool(5).submit{
            
 }
image.png

Lock

Locksynchronized更加灵活,主要有两个实现类ReentrantLockReentrantReadWriteLock
Lock 分为公平锁非公平锁,公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的 FIFO先进先出顺序。非公平锁是一种获取锁的抢占机制,是随机获得锁的。
ReentrantLock主要方法lock()unlock()
ReentrantReadWriteLock读写锁,多个读锁之间不互斥;读锁与写锁互斥;写锁与写锁互斥,主要方法为readLock().lock()writeLock().lock()
Condition两个主要方法await()signal()

上一篇 下一篇

猜你喜欢

热点阅读