首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Ryan Miao

    java并发编程(3):ThreadLocal

    /** * 学习ThreadLocal * Created by mrf on 2016/3/6. */ public class ConnectionManager { private 因为在上面的代码分析过程,我们发现如果没有先set的话,即在map查找不到对应的存储,则会通过调用setInitialValue方法返回i,而在setInitialValue方法个,有一个语句是T 则要设置initialValue方法: /** * 不用set,则必须重写initialValue * 设置的内容是可以自己定义的,这里只是示例 */ class TestThreadLocal3{ test = new TestThreadLocal3(); System.out.println("===========main线程=============="); /** * Created by mrf on 2016/3/4. */ public class TestThreadLocal { private static ThreadLocal<

    822120发布于 2018-03-13
  • 来自专栏静晴轩

    Java 并发

    如何创建一个线程 按 Java 语言规范的说法,创建线程只有一种方式,就是创建一个 Thread 对象。 而从 HotSpot 虚拟机的角度看,创建一个虚拟机线程 有两种方式,一种是创建 Thread 对象,另一种是创建 一个本地线程,加入到虚拟机线程。 如果从 Java 语法的角度。有两种方法。 Executors JDK 的 java.util.concurrent.Executors 类提供了几个静态的方法,用于创建不同类型的线程池。 原理 JDK 的线程池通过 HashSet 存储工作者线程,通过 BlockingQueue 来存储待处理任务。 另外,如果待处理队列没有任务要处理,并且工作者线程数目超过了核心工作者数目,那么,需要减少工作者线程数目。

    89760发布于 2018-03-27
  • 来自专栏Java并发

    Java并发——并发的锁(五)

    一、Java锁分类 1.1 偏向锁/轻量级锁/重量级锁 这三种锁指的是synchronized锁的状态,Java1.6之前是基于重量级锁,Java1.6之后对synchronized进行了优化,为了减少获取和释放锁带来的性能消耗 在并发环境,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列,以后会按照FIFO(先进先出)的规则从队列取到自己。 3、例子 在Java并发,ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,默认是非公平锁。 二、synchronized锁 详细见Java并发——synchronized锁 三、Lock锁 Java并发——Lock锁 四、synchronized 和 Lock 对比 相同点: 1、synchronized 和 Lock 都是用来保护资源线程安全的 2、都可以保证可见性 3、synchronized 和 ReentrantLock 都是可重入的 不同点: 1、实现方式不同 Synchronized是Java

    2.5K00编辑于 2024-04-25
  • 来自专栏Java帮帮-微信公众号-技术文章全总结

    Java并发学习3【面试+工作】

    Java并发学习3【面试+工作】 六.读写锁 ReadWriteLock是jdk5提供的读写分离锁。读写分离锁可以有效的帮助减少锁竞争,以提升性能。 用锁分离的机制来提升性能非常容易理解,比如线程A1,A2,A3进行写操作,B1,B2,B3进行读操作,如果使用重入锁或者内部锁,则理论上说所有读之间、读和写之间、写和写之间都是串行操作。 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。 提供定时执行、定期执行、单线程、并发控制等功能。 以上成员都在java.util.concurrent包下,是jdk并发包的核心类。其中ThreadPoolExecutor表示一个线程池。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

    44740发布于 2018-07-26
  • 来自专栏架构探险之道

    Java 并发并发原理剖析之ConcurrentLinkedQueue

    [Java] Java 并发并发原理剖析之ConcurrentLinkedQueue ConcurrentLinkedQueue是线程安全的无界非阻塞队列,其底层数据结构使用单向链表实现,对于入队和出队操作使用 队列包含的元素是从head访问的非空节点。通过CAS将节点的引用指向null,自动的会将它从队列移除。 队列的头部 是队列时间最长的元素。队列的尾部 是队列时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。 内存一致性效果:当存在其他并发 collection 时,将对象放入 ConcurrentLinkedQueue 之前的线程的操作 happen-before 随后通过另一线程从 ConcurrentLinkedQueue REFERENCES Java并发编程之美 JDK-API-DOCS

    55620发布于 2019-07-25
  • 来自专栏奔跑的蛙牛技术博客

    java并发知识点(3)-同步

    两个线程同时更新一个银行账户的时候,会出现问题 问题在于对金额的增加操作不是不可分割的原子操作 amounts[to] 可以被处理成为以下操作 1)将amounts[to] 加载到寄存器 2)增加amount 3) 有两种方法防止代码块受并发干扰 1. 它们从新竞争进入锁对象,一旦锁可用,他们某个将从await调用返回,获得该锁从上次阻塞的地方继续运行 一旦使用await,没法激活自身,需要寄希望与其他线程。

    61620发布于 2018-09-05
  • 来自专栏韩曙亮的移动开发专栏

    Java 并发编程】线程简介 ( 进程与线程 | 并发概念 | 线程间通信 | Java 并发 3 特性 )

    文章目录 一、进程与线程 二、并发 三、线程间通信 四、Java 并发 3 特性 一、进程与线程 ---- 最开始是没有线程这个概念的 , 一个应用程序就是一个进程 , 应用程序运行时 , 如果还要处理与用户交互的逻辑 引入了线程概念 ; 进程 : 每个应用都是一个独立进程 , 是 资源分配 , 调度 的最小单元 ; 线程 : CPU 调度的最小单元 ; 二、并发 ---- CPU 是多核的 ; 进程 是在 物理内存 串行 执行 , 必须 并发 执行 , 才能保证所有的应用程序 , 都能得到很好的用户体验 ; 并行 是 同一个 时间点 处理多个事件 ; 并发 是 同一个 时间段 处理多个事件 ; 三、线程间通信 - 本地内存 , 有一个 共享变量的副本 ; 在 主内存 , 有很多 共享变量 ; 主内存中有变量 int a = 1 , 如果线程 A 想要访问变量 a , 就会将该变量 int a = 1 ; 四、Java 并发 3 特性 ---- Java 并发3 特性 : 原子性 : 每个操作都是 不可拆分的原子操作 ; 在线程中进行 a++ 就不是原子操作 , 该操作分为 3 个步骤

    56230编辑于 2023-03-29
  • 来自专栏Android开发经验分享

    Java并发工具类

    转载请以链接形式标明出处: 本文出自:103style的博客 Java并发编程的艺术笔记 并发编程的挑战 Java并发机制的底层实现原理 Java内存模型 Java并发编程基础 Java的锁的使用和实现介绍 Java并发容器和框架 Java的12个原子操作类介绍 Java并发工具类 Java的线程池 Executor框架 ---- 简介 在JDK的并发包里提供了几个非常有用的并发工具类。 假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发地读取,但是如果读到内存后,还需要存储到数据库,而数据库的连接数只有10个,这时我们必须控制只有10个线程同时获取数据库连接保存数据 虽然有20个线程在执行,但是只允许5个并发执行。 Semaphore(5)表示允许5个线程获取许可证,也就是最大并发数是5。

    36410编辑于 2022-12-19
  • 来自专栏Java开发

    如何理解Java并发

    Java 并发(Concurrency) 指多个任务在同一时间段内交替执行(宏观上同时进行,微观上可能是 CPU 快速切换调度),目的是提高程序效率,充分利用系统资源(如 CPU、内存、I/O 等) undefined例如:4 核 CPU 同时运行 4 个线程是并行,1 核 CPU 快速切换 4 个线程是并发。三、Java 实现并发的方式Java 提供了多种并发编程工具,核心是通过线程实现:1. 包装任务 FutureTask<Integer> futureTask = new FutureTask<>(task); // 3. ExecutorService pool = Executors.newFixedThreadPool(3); // 提交5个任务(线程池会复用3个线程处理) 理解并发Java 进阶的关键,尤其在高并发场景(如分布式系统、高流量服务器),合理设计并发模型能显著提升系统性能。

    26710编辑于 2025-10-15
  • 来自专栏程序那些事

    java并发ExecutorService的使用

    java并发ExecutorService的使用 ExecutorService是java的一个异步执行的框架,通过使用ExecutorService可以方便的创建多线程执行环境。 第一种方式是使用Executors的工厂类方法,例如: ExecutorService executor = Executors.newFixedThreadPool(10); 除了newFixedThreadPool Future<String>> futures = executorService.invokeAll(callableTasks); 关闭ExecutorService 如果ExecutorService的任务运行完毕之后 ExecutorService和 Fork/Join java 7 引入了Fork/Join框架。那么两者的区别是什么呢? 本文的代码请参考https://github.com/ddean2009/learn-java-concurrency/tree/master/ExecutorService

    1.7K10发布于 2020-07-08
  • 来自专栏程序那些事

    java并发CountDownLatch的使用

    java并发CountDownLatch的使用 在java并发,控制共享变量的访问非常重要,有时候我们也想控制并发线程的执行顺序,比如:等待所有线程都执行完毕之后再执行另外的线程,或者等所有线程都准备好了才开始所有线程的执行等 最后在主线程调用await()方法来等待子线程结束执行。 我们是主线程等待子线程,那么在这个例子,我们将会看看怎么子线程一起等待到准备好的状态,再一起执行。 思路也很简单,在子线程开始之后,将等待的子线程计数器减一,在主线程await该计数器,等计数器归零之后,主线程再通知子线程运行。 sync.tryAcquireSharedNanos(1, unit.toNanos(timeout)); } 本文的例子可以参考https://github.com/ddean2009/learn-java-concurrency

    53410发布于 2020-07-08
  • 来自专栏后端精进之路

    Java并发编程系列-(9) JDK 8910并发

    9.2 改进的读写锁:StampedLock StampedLock是JDK 8引入的新的锁机制,可以认为是读写锁的一个改进版本,读写锁虽然分离了读和写,使得读与读之间可以完全并发,但是读和写之间仍然是冲突的 简单粗暴的分散了高并发下的竞争压力。 答案就在LongAdder的java doc,从我们翻译的那段可以看出,LongAdder适合的场景是统计求和计数的场景,而且LongAdder基本只提供了add方法,而AtomicLong还具有cas 从java doc可以看出,其适用于统计计数的场景,例如计算qps这种场景。在高并发场景下,qps这个值会被多个线程频繁更新的,所以LongAdder很适合。 ---- 参考: https://www.jianshu.com/p/22d38d5c8c2a 《实战Java并发程序设计》

    42410编辑于 2023-10-19
  • 来自专栏产品优化

    Java 并发编程·Java 并发

    Java 并发 线程状态转换 新建(New) 创建后尚未启动。 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片。 時雨:在 《Java 并发核心知识体系精讲》,参考 Oracle 官方文档,标注实现多线程方式只有两种:实现 Runnable 接口和继承 Thread 类。 它是 JUC 并发的核心基础组件。 CountDownLatch 用来控制一个或者多个线程等待多个线程。 Semaphore Semaphore 类似于操作系统的信号量,可以控制对互斥资源的访问线程数。 以下代码模拟了对某个服务的并发请求,每次只能有 3 个客户端同时访问,请求总数为 10。 在 Java 内存模型,允许编译器和处理器对指令进行重排序,重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。

    3.2K32编辑于 2022-12-01
  • 来自专栏卯金刀GG

    并发Java3):Java内存模型和线程安全

    网上很多资料在描述Java内存模型的时候,都会介绍有一个主存,然后每个工作线程有自己的工作内存。数据在主存中会有一份,在工作内存也有一份。工作内存和主存之间会有各种原子操作去进行同步。 有序性 在并发时,程序的执行可能就会出现乱序。 计算机在执行代码时,不一定会按照程序的顺序来执行。 这个要从cpu指令说起,Java的代码被编译以后,最后也是转换成汇编码的。 接下来看一个Java虚拟机层面产生的可见性问题 问题来自于一个Blog 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 接下来看一些在“Java语言规范”的示例 ? 上图说明了指令重排将会导致结果不同。 ? 上图使r5=r2的原因是,r2=r1.x,r5=r1.x,在编译时直接将其优化成r5=r2。

    58810发布于 2019-07-25
  • 来自专栏架构师成长之路

    java并发编程实战(3) Lock显示锁

    一 、synchronized问题   synchronized是java的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢?    1)Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。 ,3个写线程 for (int i = 0; i < 3; i++) { //启动1个读线程 new Thread() { 在Java,synchronized就不是可中断锁,而Lock是可中断锁。    在Java,synchronized就是非公平锁,它无法保证等待的线程获取锁的顺序。

    55320编辑于 2022-04-14
  • 来自专栏程序猿的大杂烩

    Java并发编程(3)- 如何安全发布对象

    不安全的发布示例: package org.zero.concurrency.demo.example.publish; import lombok.extern.slf4j.Slf4j; import java.util.Arrays SingletonExample4(); 语句的时候,底层实际进行了以下三步操作: 1.memory = allocate() // 分配对象的内存空间 2.ctorInstance() // 初始化对象 3. 经过JVM和CPU的优化,指令可能会重排成下面的顺序: 1.memory = allocate() // 分配对象的内存空间 3.instance = memory // 设置instance 指向刚分配的内存 2.ctorInstance() // 初始化对象 假设按照这个指令顺序执行的话,那么当线程A执行完1和3时,instance对象还未完成初始化,但已经不再指向null。 始终保证是下面的顺序: 1.memory = allocate() // 分配对象的内存空间 2.ctorInstance() // 初始化对象 3.instance = memory //

    80420发布于 2020-09-23
  • 来自专栏java一日一条

    java并发锁的3种实现

    提到锁,大家可能都会想到synchronized关键字,使用它的确可以解决一切并发问题,但是对于系统吞吐要求更高的,在这里提供了几个小技巧,帮助大家减小锁粒度,提高系统并发能力。 int num=storage.get(key); storage.set(key,num+1); lock.unlock(key); 这个比较类似于数据库表锁和行锁的概念,显然行锁的并发能力比表锁高很多 由于锁的粒度局限于具体用户,使系统获得了最大程度的并发。 ? CopyOnWriteMap? 既然说到了“类似于数据库的行锁的概念”,就不得不提一下MVCC,JavaCopyOnWrite类实现了MVCC。Copy On Write是这样一种机制。 直接使用Java ConcurrentHashMap?或者你想加入自己更精细的控制?

    3.2K30发布于 2018-09-14
  • 来自专栏悠扬前奏的博客

    Java并发-3.synchronized关键字

    Javasynchronized关键字作用是实现线程间的同步。它对同步的代码加锁,使得每次只能有一个线程进入同步快,以此保证线程间的安全性。 200000 */ 1.2 synchronized只对代码块加锁,并未对代码块所在的对象加锁 当一个线程访问对象的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该对象的非 A:3 A:4 B count:5 2. method(); } // main函数略 } 以上代码执行结果为: SyncThread2:0 SyncThread2:1 SyncThread2:2 SyncThread2:3 } } public synchronized void run() { method(); } // main函数略 } 执行结果同3例子一样

    48820发布于 2019-05-28
  • 来自专栏王念博客

    java并发的volatile和synchronized

    今天使用到了volatile关键字,之前了解到这个关键字,但是不知道他的具体作用是什么,下面就来详细解释一下他的作用: 在java线程并发处理,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块(synchronized) 和 volatile 关键字机制。 在Java内存模型,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。 synchronized int geti3() { return i3;} geti1()得到存储在当前线程i1的数值。 线程内存的数据被消除,从“主”内存区域中读入(Java虚拟机能优化此步。。。[后面的不知道怎么表达,汗]) 3. 代码块被执行 4.

    57030发布于 2019-07-24
  • 来自专栏码农架构

    Java并发编程:并发死锁的形成条件及处理

    02 死锁的处理 由于死锁的检测涉及到很多复杂的场景,而且它还是运行时才会产生的,所以编程语言编译器一般也不会提供死锁的检测功能,包括Java也不提供死锁检测功能。 这其实就叫做鸵鸟算法,对于某件事如果我们没有很好的处理方法,那么就学鸵鸟一样把头埋入沙假装什么都看不见。 具体就是将锁的获取进行顺序化,所有线程和进程对锁的获取都按指定的顺序进行,比如下图中P1、P2、P3三个线程它们都先尝试持有R1锁,再尝试持有R2锁,最后尝试持有R3锁。 这时线程P3则能够获取到R1锁,于是能够解除等待,自此解除了死锁状态。 ? 死锁的处理主要包括锁的顺序化、资源合并、避免锁嵌套等事前预防措施和超时机制、抢占资源机制、撤销线程机制等事的处理措施 - END -

    86440发布于 2020-12-28
领券