![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
不止于代码
这个作者很懒,什么都没留下…
展开
-
为什么会出现锁机制(线程同步)?
线程同步的概念: Java 允许多线程并发控制,当多个线程同时操作一个可共享资源时(如数据的增删改查),会导致数据不明确,相互之间发生冲突,因此加入同步锁以保证在该线程没有完成操作之前不会被其它线程调用,从而保证了该变量的唯一性和准确性。 ...原创 2018-12-14 16:58:44 · 230 阅读 · 0 评论 -
Java 创建线程的三种方式及其对比
Java中创建线程主要有三种方式: 一、继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 (2)创建Thread子类的实例,即创建了线程对象。 (3)调用线程对象的start()方法来启动该线程。 package com.thread; public class ...转载 2019-03-31 16:07:57 · 189 阅读 · 0 评论 -
Java 中的线程有几种状态?
线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。 1、新建状态(New):当 new 出一个线程对象来时,线程就进入了新建状态。 2、就绪状态(Runnable):当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。 3、运行状态(R...原创 2019-01-17 16:06:34 · 210 阅读 · 0 评论 -
简述 AbstractQueuedSynchronied
AbstractQueuedSynchronied 提供了一个基于 FIFO (先入先出)的队列,可以用于构造锁或者其它同步装置的基本框架,AQS 将等待获取锁的所有线程放在一个同步队列中,每个节点(Node)表示一个线程,包含头结点(Head)、尾节点(Tail)、节点的状态(State) ...原创 2019-01-17 15:34:44 · 115 阅读 · 0 评论 -
Reentrantlock 简介及其使用场景
1、Reentrantlock 是并发包中一个可重入的锁,是基于AQS(AbstractQueuedSynchronized)实现的,它有公平锁和不公平锁两种实现方式。 2、Reentranlock 中有一个内部抽象类 Sync 继承自 AbstractQueuedSynchronized ,主要是它来实现锁的功能, Sync 在 ReentrantLock 中有两种实现类:Nonf...原创 2019-01-06 17:27:02 · 2154 阅读 · 0 评论 -
Java 中的 Condition
1、Condition 实际上是 java.util.concurrent.locks 中的一个接口。 2、Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,C...原创 2019-01-06 16:31:21 · 491 阅读 · 0 评论 -
synchronized 和 Lock 的区别?
1、synchronized 是 Java 的一个关键词;而 Lock 是一个接口。 所以 synchronized 是在 JVM 层面上实现的,synchronized 在锁定时如果方法快抛出异常, JVM 就会自动将锁释放掉,不会因为出了异常而没有释放锁而造成死锁; 而 Lock 是使用代码实现的,系统不会自动释放锁,必须在 finally 语句中显式地释放锁 lock.unlock,所以使用...原创 2019-01-05 18:12:34 · 110 阅读 · 0 评论 -
volatile和synchronized的区别?
volatile 和 synchronized 都可以实现可见性。 volatile 关键字可以保证变量会直接从主内存中读取,在写入的时候也是直接写入到主内存。 volatile 是基于 Memory Barrier (内存屏障)来实现的,也就是可以禁止指令重排序。如果一个变量是由 volatile 修饰的,那么 Java 内存模型(JMM)在写入这个变量之后会插入一条 writer-barrie...原创 2018-12-24 16:27:00 · 174 阅读 · 0 评论 -
启动线程时,使用start( ) 和run( )的区别?
1、用 start()方法启动线程,真正实现了多线程运行。它无需等 run()方法执行完毕就可以执行下面的代码。(因为此时线程正处于排队的空闲,可以做别的事) 通过调用 Thread类 的 start()方法,线程进入就绪(可运行)状态,此时多个线程开始排队等待 CPU 分配时间段,线程一直等到 CPU 分配到时间段,也就是说轮到该线程了,这时再通过调用 Thread 类的 run()方法来让线程...原创 2018-12-29 15:49:24 · 1012 阅读 · 0 评论 -
Java 内存模型中的happens-before 原则
1、happens-before 原则阐述了多线程之间的内存可见性。也就是说它是用来规定某个线程修改的变量在什么时候对其它线程可见的。 happens-before 原则是判断数据是否存在竞争、线程是否安全的主要依据,依靠这个原则,我们才能解决在并发环境下两操作之间是否可能存在冲突的所有问题。 在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-bef...原创 2018-12-16 16:50:39 · 114 阅读 · 0 评论 -
Java线程同步的五种方式
1、同步方法,使用synchronized关键字修饰的方法。 2、同步代码块,使用synchronized关键字修饰的代码块。 3、使用特殊域变量(volatile)实现线程同步。 4、使用reentrantLock(重入锁)实现线程同步。 5、使用局部变量(ThreadLocal)实现线程同步。如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,副本之间相互独立,...原创 2018-12-14 21:26:24 · 434 阅读 · 0 评论