美文网首页
JAVA线程相关

JAVA线程相关

作者: EmpathyBasic | 来源:发表于2020-03-05 19:58 被阅读0次

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都是为了解决多线程中相同变量的访问冲突问题,不同的点是
  • Synchronized是通过线程等待,牺牲时间来解决访问冲突
  • ThreadLocal是通过每个线程单独一份存储空间,牺牲空间来解决冲突,并且相比于Synchronized,ThreadLocal具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值。

正因为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()

相关文章

  • Android 高级面试-3:语言相关

    主要内容:Kotlin, Java, RxJava, 多线程/并发, 集合 1、Java 相关 1.1 缓存相关 ...

  • Java线程基本方法

    相关线程的基本方法,都会影响Java线程状态的变化,常见的Java线程方法有wait、notify、notifyA...

  • Android下多线程的实现

    Android下多线程相关 线程安全相关问题参考:java内存模型与线程 android下与多线程有关的主要有以下...

  • Java的juc相关容器,工具,框架介绍

    主要介绍Java相关并发容器,原子类,以及线程池框架 Java相关并发容器 ConcurrentHashMap采用...

  • java线程相关

    做了一个跟多线程相关的oj。遇到几个问题如下: 1 同一个线程不能多次start(),否则出发异常,如果需要多次启...

  • java线程相关

    中断一个正在运行的线程 中断阻塞线程的方法 我们调用线程对象的interrupt()方法时会产生Interrupt...

  • Java 线程相关

    目录1.并行与并发2.进程与线程---- 2.1 进程---- 2.2 线程---- 2.3 进程与线程的区别--...

  • JAVA线程相关

    thread.join() 等待thread线程执行完才继续向下执行代码,但是可以执行之前的线程Thread.sl...

  • Java『线程相关』

    Java线程 线程是进程中实施调度和分派的基本单位。一个进程可以包含多个线程,一个线程只能在一个进程的地址空间内活...

  • Java 线程池

    Java线程池是java cocurrent包下提供的类,使用非常方便。本文希望整理下Java 线程池相关的知识以...

网友评论

      本文标题:JAVA线程相关

      本文链接:https://www.haomeiwen.com/subject/qjhqlhtx.html