java多线程
viqiang1991
这个作者很懒,什么都没留下…
展开
-
8种方法实现在多线程中让线程按顺序运行的方法
一、实现本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。使用的方法如下:[1] 使用线程的join方法[2] 使用主线程的join方法[3] 使用线程的wait方法[4] 使用线程的线程池方法[5] 使用线程的Condition(条件变量)方法[6...转载 2020-04-22 15:28:53 · 842 阅读 · 0 评论 -
Java 中的锁有哪些?
1.公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。对于Java ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。对于Synchronized而言,也是一种非公平锁。由于其并不...原创 2020-04-20 10:38:52 · 1060 阅读 · 0 评论 -
ThreadLocal的具体使用场景
1.ThreadLocal的使用场景1.1每个线程需要一个独享对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random)每个Thread内有自己的实例副本,不共享比喻:教材只有一本,一起做笔记有线程安全问题。复印后没有问题,使用ThradLocal相当于复印了教材。1.2每个线程内需要保存全局变量(例如在拦截器中获取用户信息),可以让不同方法直接...翻译 2020-04-16 16:02:50 · 846 阅读 · 0 评论 -
还在用Synchronized?Atomic你了解不?
如果是count++操作,使用如下类实现: AtomicInteger count = new AtomicInteger(); count.addAndGet(1);如果是 JDK8,推荐使用 LongAdder 对象,比 AtomicLong 性能更好(减少乐观锁的重试次数)。一、基础铺垫public class AtomicMain { public static voi...原创 2020-02-29 17:38:04 · 255 阅读 · 0 评论 -
初始多线程
进程的定义:进程是程序的一次执行,进程是一个程序及其数据在处理机上顺序执行时所发生的活动,进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。进程是系统进行资源分配和调度的独立单位。每一个进程都有它自己的内存空间和系统资源。那系统有了进程这么一个概念了,进程已经是可以进行资源分配和调度了,为什么还要线程呢?为使程序能并发执行,系统必须...原创 2020-02-29 09:53:52 · 157 阅读 · 0 评论 -
浅谈ThreadLocal
什么是ThreadLocalThreadLocal提供了线程的局部变量,每个线程都可以通过set()和get()来对这个局部变量进行操作,但不会和其他线程的局部变量进行冲突,实现了线程的数据隔离。简要言之:往ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal可以让我们拥有当前线程的变量,那这个作用有什么用呢?*管理Conne...原创 2020-02-29 09:34:32 · 290 阅读 · 0 评论 -
线程池中的一些细节
线程池的工作原理我认为线程池它就是一个调度任务的工具。众所周知在初始化线程池会给定线程池的大小,假设现在我们有 1000 个线程任务需要运行,而线程池的大小为 10,20 个线程来调度这1000个任务。而这里的 10~20 个线程最后会由线程池封装为ThreadPoolExecutor.Worker对象,而这个Worker是实现了 Runnable 接口的,所以他自己本身就是一...原创 2020-02-22 17:12:21 · 136 阅读 · 0 评论 -
线程通信的几种方式
前言开发中不免会遇到需要所有子线程执行完毕通知主线程处理某些逻辑的场景。或者是线程 A 在执行到某个条件通知线程 B 执行某个操作。可以通过以下几种方式实现:(1)等待通知机制两个线程通过对同一对象调用等待 wait() 和通知 notify() 方法来进行通讯。如两个线程交替打印奇偶数:public class TwoThreadWaitNotify { ...原创 2020-02-22 16:29:19 · 3787 阅读 · 0 评论 -
理解和优雅的使用线程池
线程池原理简单来说使用线程池有以下几个目的:线程是稀缺资源,不能频繁的创建。应当将其放入一个池子中,可以给其他任务进行复用。 解耦作用;线程的创建于执行完全分开,方便维护。我们重点来看下ThreadPoolExecutor是怎么玩的。首先是创建线程的 api:ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,...原创 2020-02-22 10:35:45 · 126 阅读 · 0 评论 -
ConcurrentHashMap 实现原理
由于HashMap是一个线程不安全的容器,主要体现在容量大于总量*负载因子发生扩容时会出现环形链表从而导致死循环。因此需要支持线程安全的并发容器ConcurrentHashMap。(1)JDK1.7 实现数据结构由Segment数组、HashEntry数组组成,和HashMap一样,仍然是数组加链表组成。ConcurrentHashMap采用了分段锁技术,其...原创 2020-02-22 09:56:15 · 175 阅读 · 0 评论 -
ReentrantLock 实现原理
使用synchronized来做同步处理时,锁的获取和释放都是隐式的,实现的原理是通过编译后加上不同的机器指令来实现。而ReentrantLock就是一个普通的类,它是基于AQS(AbstractQueuedSynchronizer)来实现的。AQS是Java并发包里实现锁、同步的一个重要的基础框架。是一个重入锁:一个线程获得了锁之后仍然可以反复的加锁,不会出现自己阻塞自己的情...原创 2020-02-22 09:37:20 · 107 阅读 · 0 评论 -
锁的一些概念
(1)同一进程重入锁使用ReentrantLock获取锁的时候会判断当前线程是否为获取锁的线程,如果是则将同步的状态 +1 ,释放锁的时候则将状态 -1。只有将同步状态的次数置为 0 的时候才会最终释放锁。读写锁使用ReentrantReadWriteLock,同时维护一对锁:读锁和写锁。当写线程访问时则其他所有锁都将阻塞,读线程访问时则不会。通过读写锁的分离可以很大程度的...原创 2020-02-22 09:09:10 · 100 阅读 · 0 评论 -
Java 多线程三大核心
1.原子性Java的原子性就和数据库事务的原子性差不多,一个操作中要么全部执行成功或者失败。JMM只是保证了基本的原子性,但类似于i++之类的操作,看似是原子操作,其实里面涉及到:获取 i 的值。 自增。 再赋值给 i。这三步操作,所以想要实现i++这样的原子操作就需要用到synchronized或者是lock进行加锁处理。如果是基础类的自增操作可以使用...原创 2020-02-22 08:57:49 · 153 阅读 · 0 评论 -
synchronized 关键字原理
众所周知synchronized关键字是解决并发问题常用解决方案,有以下三种使用方式:同步普通方法,锁的是当前对象。 同步静态方法,锁的是当前Class对象。 同步块,锁的是()中的对象。实现原理:JVM是通过进入、退出对象监视器(Monitor)来实现对方法、同步块的同步的。具体实现是在编译之后在同步方法调用前加入一个monitor.enter指令,在退出方...原创 2020-02-21 21:33:59 · 79 阅读 · 0 评论 -
Java 多线程常见问题
1.上下文切换多线程并不一定是要在多核处理器才支持的,就算是单核也是可以支持多线程的。 CPU 通过给每个线程分配一定的时间片,由于时间非常短通常是几十毫秒,所以 CPU 可以不停的切换线程执行任务从而达到了多线程的效果。但是由于在线程切换的时候需要保存本次执行的信息,在该线程被 CPU 剥夺时间片后又再次运行恢复上次所保存的信息的过程就称为上下文切换。注意:上下文切换是非常耗效率的。...原创 2020-02-21 21:28:56 · 144 阅读 · 0 评论