多线程
小猫的秋刀鱼
这个作者很懒,什么都没留下…
展开
-
Synchronized 和 Volatile、Lock 以及 ReentrantLock的区别
一、线程安全在三个方面体现1、原子性(atomic、synchronized、Lock)(1)原子的意思代表着——“不可分”;(2)在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。原子性是拒绝多线程交叉操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。例如 a=1是原子性操作,但是a++和a +=1就不是原子性操作。1.1、atomic实现原子性JDK里面提供了很多atomic类,AtomicInteger,AtomicLong,AtomicBoole原创 2020-07-18 12:51:18 · 1499 阅读 · 0 评论 -
乐观锁和悲观锁
一、并发控制当程序中可能出现并发的情况时,就需要通过一定的手段来保证在并发情况下数据的准确性,通过这种手段保证了当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的。这种手段就叫做并发控制。并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。没有做好并发控制,就可能导致脏读、幻读和不可重复读等问题。常说的并发控制,一般都和数据库管理系统(DBMS)有关。在DBMS中的并发控制的任务,是确保在多个事务同时存取数据库中同一数据时,不破坏事务的隔离性和统一性以及数据原创 2020-07-17 16:29:35 · 141 阅读 · 0 评论 -
synchronized底层实现原理及锁优化
一、概述synchronized作用原子性:synchronized保证语句块内操作是原子的可见性:synchronized保证可见性(通过“在执行unlock之前,必须先把此变量同步回主内存”实现)有序性:synchronized保证有序性(通过“一个变量在同一时刻只允许一条线程对其进行lock操作”)synchronized的使用修饰实例方法,对当前实例对象加锁修饰静态方法,对当前类的Class对象加锁修饰代码块,对synchronized括号内的对象加锁二、实现原理JVM是基于进入原创 2020-07-17 12:20:47 · 513 阅读 · 0 评论 -
ThreadLocal原理及使用场景
ThreadLocalThreadLocal是线程的内部存储类,是一个数据结构,有点像HashMap,可以保存"key : value"键值对,但是一个ThreadLocal只能保存一个,并且各个线程的数据互不干扰,可以在指定线程内存储数据,并且只有指定线程可以得到存储数据。ThreadLocal<String> localName = new ThreadLocal();localName.set("AAA");String name = localName.get();在线程1中原创 2020-06-20 17:52:42 · 1087 阅读 · 0 评论 -
多线程锁的升级原理
synchronized 原理synchronized 关键字编译后会在同步块的前后添加上 montorenter 和 monitorexit 两个字节码指令,这两个字节码指令都需要一个指向锁定和解锁对象的 reference,如果指定了同步的对象reference就指向这个对象,如果修饰的是方法,如果是类方法就指向Class对象,如果是实例方法就指向这个实例。对象头和锁synchronized 使用的锁存在 Java 对象头中。HotSpot 虚拟机的对象头分两部分信息,第一部分用于存储对象自身的运原创 2020-06-20 16:08:20 · 1755 阅读 · 0 评论 -
线程池的状态、submit()和execute()方法的区别
一、线程池的结构1、线程池管理器(ThreadPoolManager):用于创建并管理线程池2、工作线程(WorkThread): 线程池中线程3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。4、任务队列:用于存放没有处理的任务。提供一种缓冲机制。二、线程池的5种状态Running、ShutDown、Stop、Tidying、Terminated。线程池各个状态切换框架图:RUNNING:线程池的初始化状态,接受新的任务,处理等待队列中的任务。线程池被一旦被创原创 2020-06-17 23:38:19 · 578 阅读 · 1 评论 -
wait()和notifyAll()使用---生产者和消费者模型
锁池和等待池锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池中notify和notifyAll的区别 如果线程调用了对象的 wait(原创 2020-06-01 14:46:58 · 201 阅读 · 0 评论 -
实现线程的三种方式以及线程安全
Java中使用Thread代表线程类,所有的线程类都必须是Thread类或者其子类的实例。每个线程的作用就是完成一定的任务,即执行一段程序流。Java中使用线程执行体来表示这段程序流。Java中线程的实现方式有如下三种:1.继承Thread类 定义Thread类的子类,并重写Thread类的run()方法,创建子类对象(即线程对象),调用线程对象的start()方法来启动该线程。package com.example;public class ThreadDemo extends Thre原创 2020-05-28 16:21:16 · 456 阅读 · 0 评论