并发
文章平均质量分 95
Java 并发
请叫我大师兄_
请叫我大师兄
展开
-
Java定时线程实现:scheduleAtFixedRate 和 scheduleWithFixedDelay 的差别
Java实现定时任务,一般都是用一个线程,设置个时间,让他定时执行,注意力一般都是集中在这个线程的实现,很少考虑到具体定时执行线程的这个过程。scheduleAtFixedRate 和 scheduleWithFixedDelay 的差别大吗?要是不了解的话,还真会因为不了解两者的差别导致一些线上bug呢!正规的做法,咱要使用线程,就得正规的使用线程池来实现线程的调用,而不能图一时之快,手动的弄个线程就给他start了,这么操作是不妥当,坚决反对。而创建线程池又有讲究,期望自己手动设置一些参数,从而了解原创 2021-11-12 16:44:54 · 3538 阅读 · 0 评论 -
java--并发 锁 Lock & Condition
并发编程的关键是什么 ?互斥同一时刻,只允许一个线程访问共享资源同步线程之间通信、协作JUC是通过Lock、Condition接口实现的管程Lock解决互斥Condition解决同步既生 synchronized 何生 Lock ?在JDK 1.5,synchronized性能差于Lock,但1.6后,synchronized被优化,将性能提高,所以1.6后又推荐使用synchronized。所以并不是因为性能问题才生的lock。问题的关键在于:死锁问题的破坏"不可抢占"条原创 2021-05-14 14:44:50 · 646 阅读 · 0 评论 -
Java常量池的大概理解
触摸java常量池 java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,小菜早就对常量池有所耳闻,这次好好总结一下。理论 小菜先拙劣的表达一下jvm虚拟内存分布: 程序计数器是jvm执行程序的流水线,存放一些跳转指令,这个太高深,小菜不懂。 本地方法栈是jvm调用操作系统方法所使用原创 2016-07-26 10:29:39 · 15366 阅读 · 6 评论 -
Java 一个进程支持多少个线程同时运行的测试 Java max running thread count test
测试一下一个Java程序能同时造多少个线程,一起运行。直到 java.lang.OutOfMemoryError: unable to create new native thread看其它文章说 -Xms -Xmx设置heap的大小以及 -Xss 设置单个stack的大小对这个数有影响,我在 -Xms 10m,1g,6g -Xss170k, 10m,100m,都是在4075左右就OOM拉。测试环境,jdk1.8 ,mac os原创 2020-07-27 15:46:25 · 715 阅读 · 0 评论 -
Java 线程池之 四个拒绝策略
jdk中关于线程池的拒绝策略的接口的实现,暂时就四个,如下:AbortPolicy -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。CallerRunsPolicy -- 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。DiscardOldestPolicy -- 当...原创 2020-04-01 16:33:25 · 7935 阅读 · 0 评论 -
Java 多线程的4种实现方法
实现线程的众所周知的方法具体有2种,但是还有一种,估计不是人人都知道的,没搞过多线程编程的,估计就不知道啦:(1)继承Thread类,重写run方法(2)实现Runnable接口,重写run方法(3)实现Callable接口,重写call方法(4)线程池的使用一直天真的以为只有两种方式来实现多线程,直到我真的来仔细琢磨学习了一下这个问题,才知道,Java后来优化了问题。新增了个...原创 2016-11-12 22:42:40 · 1779 阅读 · 1 评论 -
Java并发框架中的线程池 thread pool 为啥不是直接创建 maximumPoolSize 个线程之后,再把任务丢到队列中?
在开发过程中,合理使用线程池,可以有以下好处。1,降低资源消耗;提高线程到重发利用率,降低创建和销毁线程的消耗。2,提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,再执行。3,提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。在使用Java的线程池的时候,都是使用同一个底层方法来创建线程的 public ThreadPoolExecutor(int corePoolSize, int m原创 2020-05-18 17:39:05 · 1224 阅读 · 0 评论 -
Java 多线程-synchronized用法和实现原理
造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据。当存在多个线程操作共享数据时,需要保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后再进行,这种方式有个高尚的名称叫互斥锁,即能达到互斥访问目的的锁,也就是说当一个共享数据被当前正在访问的线程加上互斥锁后,在同一个时刻,其他线程只能处于等待的状态,直到当前线程处理完毕...原创 2020-05-07 15:52:14 · 1153 阅读 · 0 评论 -
Java 线程计数器 CountDownLatch 和 循环屏障 CyclicBarrier
1,CountDownLatch倒计时器,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。举了例子:集齐七龙珠,就可以召唤神龙。下边需要派7个人(7个线程)去分别去找这7颗不同的龙珠,每个人找到之后,还需要等待的龙珠个数减1,那么当全部的人都找到龙珠之后,那么就可以召唤神龙了。具体实现代码如下:(不管是啥代码,即使是简单的测试代码,也都希望各位遵守代码规范,方便...原创 2019-09-30 17:17:36 · 1085 阅读 · 0 评论 -
Java中各种锁的详细解读
在没有实际接触和详细了解Java的各种锁之前,可能觉得Java 中的各种锁,会很多很复杂,不是的,看一遍不行,再看一遍,就差不多了,还是比较好理解的。虽然距离实际使用还是有点距离,但是,要跨出第一步,了解之后,再考虑如何使用和高级使用。这个图画的也很好1. 乐观锁 VS 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应...原创 2020-05-08 16:58:36 · 529 阅读 · 0 评论 -
Java synchronized 原理总结 详细阐述 无锁to偏向锁to轻量级锁to重量级锁的转变过程,不虚此行。
锁的内存语义synchronized的底层是使用操作系统的mutex lock实现的。内存可见性:同步快的可见性是由“如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值”、“对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store和write操作)”这两条规则获得的。 操作原子性:持有同一个锁的两个同步块只能串行地进入锁的内存语义:当线程释放锁时,JMM会把该线程对应的本地内存中的原创 2020-05-14 16:23:25 · 892 阅读 · 2 评论 -
Java 并发之 volatile 关键字全面总结
一、简介volatile是Java提供的一种轻量级的同步机制。Java语言包含两种内在的同步机制:同步块(或方法)和volatile变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。二、并发编程的3个基本概念1.原子性定义: 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要...原创 2021-03-31 14:04:53 · 540 阅读 · 1 评论 -
Java 内存模型 (JMM)总结
Java内存模型(JMM)我们常说的JVM内存模式指的是JVM的内存分区;而Java内存模式是一种虚拟机规范。Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。原始的Java内存模型存在一些不足,因此J转载 2020-05-13 15:27:42 · 569 阅读 · 0 评论 -
单例模式的八种实现--应该是你见过的最全的单例模式实现啦。
一般说到单例模式,老铁们,都是知道老师讲的:饿汉式,饱汉式,双重旋锁式。然后呢,这些个实现,老师讲的不全,马马虎虎,觉得给你说一下,就够用啦。但是,你实际被问到的时候,就觉得,当年老师说的全的,是OK的,其实不是的。老师讲的不全,毕竟老师少有很讲究刨根问底的。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控...原创 2016-03-25 13:56:01 · 10004 阅读 · 6 评论 -
volatile关键字是否真的理解了,就看怎么回答这个问题。
问题: a,b,c三个变量,其中c是volatile的,a,b是普通变量, a = 1, b = 2, c = 3, c写入之后,a,b的值也会被刷入缓存吗,还是c写入之前所有在cpu缓存的数据都会被刷入内存,还是只刷入和c在同一个缓存行的数据?答: 要按happens before来考虑这种问题,不要想着(cache),Java的修正过的内存模型其实基本点很简单,同一线程内的副作用按程序顺序发生,所以a、b、c的赋值如果是在同一线程内按这个顺序写的,实际执行就要按照这个...原创 2020-07-08 15:49:04 · 453 阅读 · 0 评论 -
Java内存中指令重排序导致的线程问题,以及 volatile 作用之禁止内存指令重排序的代码实例
一般在看JMM(Java内存模型)的时候,里面有代码会因为种种原因优化,导致指令重排。也没实际见过。也没法验证这个说法。说是volatile这个关键词可以1,禁止指令重排,2,内存可见。这都是理论,回头就忘记了。下面用实际例子,切身体会一下他这个重排序。这个Java代码例子充分的见识了指令重排序对多线程的影响,同时也是实际Java代码例子说明volatile可以禁止指令重排序,对多线程开发的作用也不小。原创 2020-06-12 12:33:06 · 957 阅读 · 0 评论 -
i++不是原子操作,看似简单,实则巨坑的一个线程同步的问题。synchronized 和 volatile
线程同步,即对多个线程可能同时访问一个资源的时候。这个时候,有个互斥的要求,一般都是加锁。synchronized。但是,有时候,仅仅这个synchronized是不够用的,还可能会使用到一个不常用的关键字:volatile下面看看这个简单的多线程同步的代码。看看加不加这个volatile会有什么不同的效果。package com.lxk.threadTest.mianShiTest.原创 2017-12-04 11:08:26 · 2434 阅读 · 10 评论 -
Java 多线程 并发中CAS详解
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是volatile不能保证原子性。因...原创 2018-05-03 11:04:11 · 4098 阅读 · 1 评论 -
一个假的单例模式,虽然有双重加锁的代码,但还是假的单例。
单例模式这东西简单,也是平时写代码最常用的一个模式了。虽然你知道单例模式的要点。1.私有(private)静态(static)的单例对象(object)2.构造函数(struct)私有化-----可在构造方法初始化单例对象3.提供对外(public),静态方法获得单例对象你也知道最常见的就是使用双重旋锁来判断对象是否已经初始化了,来控制有且只有一个单利会被初始化。但是,下面这个代码的单例模式有问题,看看能看出来哪有问题不?看不出问题的,还请继续往下看吧。public class Sender原创 2020-08-24 17:15:00 · 779 阅读 · 1 评论