多线程&高并发
多线程和高并发知识总结
原有岁月可回首
认真工作,快乐生活
展开
-
线程的创建方式
线程的创建方式继承Thread类实现实现Runnable接口方式实现Callable接口方式其中前两种比较常用。但是,需要有返回值需要实现Callable接口。代码示例继承Thread类实现 /** * 继承Thread类,并重写run方法 */ public class MyThread extends Thread { @Override public void run() { super.run(); System.o原创 2020-11-01 22:29:43 · 86 阅读 · 0 评论 -
异步获取多线程返回的数据
该问题涉及到三个接口:Callable、Future、CompletionService,还有一个类:FutureTask。下面分别进行下简单介绍:一、Future:V get() :获取异步执行的结果,如果没有结果可用,此方法会阻塞直到异步计算完成。V get(Long timeout , TimeUnit unit) :获取异步执行结果,如果没有结果可用,此方法会阻塞,但是会有时间限制,如果阻塞时间超过设定的timeout时间,该方法将抛出异常。boolean isDone() :判断任务是否原创 2020-11-01 22:22:23 · 2172 阅读 · 0 评论 -
Java中线程池的创建及自定义线程池
一、线程池简介线程池就是预先创建一些线程,它们的集合称为线程池。线程池可以很好地提高性能,在系统启动时即创建大量空闲的线程,程序将一个task给到线程池,线程池就会启动一条线程来执行这个任务,执行结束后,该线程不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。线程的创建和销毁比较消耗时间,线程池可以避免这个问题。二、如何创建线程池Executors是jdk1.5之后的一个新类,提供了一些静态方法,帮助我们方便的生成一些常见的线程池:newSingleThreadExecutor:创建原创 2020-11-01 15:55:39 · 1961 阅读 · 0 评论 -
Thread类中的start()和run()方法有什么区别
通过调用线程类的start()方法来启动一个线程,使线程处于就绪状态,即可以被JVM来调度执行,在调度过程中,JVM通过调用线程类的run()方法来完成实际的业务逻辑,当run()方法结束后,此线程就会终止。如果直接调用线程类的run()方法,会被当作一个普通的函数调用,程序中仍然只有主线程这一个线程。即start()方法能够异步的调用run()方法,但是直接调用run()方法却是同步的,无法达到多线程的目的。因此,只用通过调用线程类的start()方法才能达到多线程的目的。...原创 2020-11-01 10:33:10 · 286 阅读 · 0 评论 -
synchronized 与volatile区别
简要回答volatile是一个类型修饰符(type specifier);volatile,它能够使变量在值发生改变时能尽快地让其他线程知道;关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且只能修改变量,而synchronized可以修饰方法,以及代码块;多线程访问volatile不会发生阻塞,而synchronized会出现阻塞;volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间原创 2020-11-01 10:30:38 · 274 阅读 · 0 评论 -
Synchronized 与ThreadLocal区别
简要回答都是为了解决多线程中相同变量的访问冲突问题。Synchronized同步机制,提供一份变量,让不同的线程排队访问。ThreadLocal关键字,为每一个线程都提供了一份变量,因此可以同时访问而互不影响。ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。辅助理解ThreadLocal public class ConnectionUtil { private static ThreadLocal<原创 2020-11-01 10:22:37 · 136 阅读 · 0 评论 -
Synchronized关键字原理
一、前言Synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。学习Java的小伙伴都知道synchronized关键字是解决并发问题常用解决方案,常用的有以下三种使用方式:修饰代码块,即同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象。修饰普通方法,即同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象。修饰静态方法,其作用的范围是整个静态方法,转载 2020-11-01 10:18:43 · 102 阅读 · 0 评论 -
synchronized与Lock的区别
开始正文之前先对多线程中的一些知识点进行回顾:一、技术点1.线程与进程一个程序最少需要一个进程,而一个进程最少需要一个线程。关系是线程–>进程–>程序的大致组成结构。所以线程是程序执行流的最小单位,而进程是系统进行资源分配和调度的一个独立单位。以下我们所有讨论的都是建立在线程基础之上。Thread的几个重要方法:**start()**方法,调用该方法开始执行该线程;**stop()**方法,调用该方法强制结束该线程执行;**join()**方法,调用该方法等待该线程结束;**s原创 2020-10-24 15:32:28 · 179 阅读 · 0 评论 -
线程的状态(生命周期)
Java中线程的状态被定义在公共枚举类java.lang.Thread.state中,在Java.lang.Thread里,有个内部枚举: State,一个线程在某一时刻可以是State里的一种状态:线程的六种状态:新建(NEW):表示线程新建出来,还没有被启动的状态,比如:Thread t = new MyThread();就绪/运行(RUNNABLE):该状态包含了经典线程模型的两种状态:就绪(Ready)、运行(Running):阻塞(BLOCKED):通常与锁有关系,表示线程正在获取有锁原创 2020-10-24 14:56:07 · 98 阅读 · 0 评论 -
java中的锁
在并发场景中,会涉及到各种各样的锁,如公平锁,乐观锁,共享锁、分段所等等,本篇文章主要对并发编程中的各种锁进行介绍,主要内容有:公平锁 / 非公平锁可重入锁 / 不可重入锁独享锁 / 共享锁互斥锁 / 读写锁乐观锁 / 悲观锁分段锁偏向锁 / 轻量级锁 / 重量级锁自旋锁下面对各种锁进行详细介绍:1、公平锁 / 非公平锁公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。就是很公平,在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一原创 2020-10-20 23:19:12 · 160 阅读 · 0 评论