![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发编程
文章平均质量分 93
java并发编程
量子物理学
量子物理学是未来的发展方向,尤其是计算机方向的应用。现在的知识能力、学习能力、知识分享能力。人生能走多远,看与谁同行;有多大成就,看有谁指点。技术方向:广度-》深度-》精度。
展开
-
Java中的锁——Lock和synchronized
一、Lock接口1、Lock接口和synchronized内置锁a)synchronized:Java提供的内置锁机制,Java中的每个对象都可以用作一个实现同步的锁(内置锁或者监视器Monitor),线程在进入同步代码块之前需要或者这把锁,在退出同步代码块会释放锁。而synchronized这种内置锁实际上是互斥的,即没把锁最多只能由一个线程持有。b)Lock接口:Lock接口提供了与synchronized相似的同步功能,和synchronized(隐式的获取和释放锁,主要体现在线程进入同步转载 2021-01-09 08:27:06 · 1037 阅读 · 0 评论 -
并发编程之Future&FutureTask深入解析
前言Java线程实现方式主要有四种:继承Thread类 实现Runnable接口 实现Callable接口通过FutureTask包装器来创建Thread线程 使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。Callable 和 Runnable 接口Runnable接口//实现Runnable接口的类将被Thread执行,表示一个基本的任务publicinterfa..转载 2021-01-05 08:47:53 · 1170 阅读 · 1 评论 -
ThreadLocal为什么会发生内存泄漏?
前言ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用 ThreadLocal,就可能会导致内存泄漏。下面,我们将围绕三个方面来分析 ThreadLocal 内存泄漏的问题ThreadLocal 实现原理 ThreadLocal为什么会内存泄漏 ThreadLocal 最佳实践ThreadLocal 实现原理ThreadLocal的实现是这样的:每个Thread..原创 2020-11-17 15:05:28 · 1053 阅读 · 0 评论 -
使用 ThreadLocal如何避免内存泄露
1.ThreadLocal的使用场景1.1 场景1每个线程需要一个独享对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random)每个Thread内有自己的实例副本,不共享比喻:教材只有一本,一起做笔记有线程安全问题。复印后没有问题,使用ThradLocal相当于复印了教材。1.2 场景2每个线程内需要保存全局变量(例如在拦截器中获取用户信息),可以让不同方法直接使用,避免参数传递的麻烦2.对以上场景的实践2.1 实践场景1运行结..原创 2020-11-17 14:51:29 · 2154 阅读 · 1 评论 -
Monitor简介
什么是Monitor?1.Monitor是一种用来实现同步的工具2.与每个java对象相关联,即每个java对象都有一个Monitor与之对应3.Monitor是实现Sychronized(内置锁)的基础Monitor的基本结构是什么?1.Owner字段:初始时为NULL表示当前没有任何线程拥有该monitor record,当线程成功拥有该锁后保存线程唯一标识,当锁被释放时又设置为NULL2.EntryQ字段:关联一个系统互斥锁(semaphore),阻塞所有试图锁住moni.原创 2020-10-28 10:37:13 · 3224 阅读 · 0 评论 -
布隆过滤器
前言我们之前讲了Redis的缓存雪崩、穿透、击穿。在文章里我们说了解决缓存穿透的办法之一,就是布隆过滤器,但是上次并没有讲如何使用布隆过滤器。什么是布隆过滤器布隆过滤器(Bloom Filter),是1970年,由一个叫布隆的小伙子提出的,距今已经五十年了,和老哥一样老。它实际上是一个很长的二进制向量和一系列随机映射函数,二进制大家应该都清楚,存储的数据不是0就是1,默认是0。主要用于判断一个元素是否在一个集合中,0代表不存在某个数据,1代表存在某个数据。懂了吗?作为暖男的老哥在给你转载 2020-10-14 09:05:11 · 276 阅读 · 0 评论 -
Spring Cache
为什么使用缓存前几天我在文章《我是如何把一个15分钟的程序优化到了10秒的》中,提到了一些在代码层面优化性能的方法。其中第一个就是使用缓存。使用缓存是一个很“高性价比”的性能优化方式,尤其是对于有大量重复查询的程序来说。通常来说,在WEB后端应用程序来说,耗时比较大的往往有两个地方:一个是查数据库,一个是调用其它服务的API(因为其它服务最终也要去做查数据库等耗时操作)。重复查询也有两种。一种是我们在应用程序中代码写得不好,写的for循环,可能每次循环都用重复的参数去查询了。这种情况,比较聪明一转载 2020-10-14 09:02:26 · 18257 阅读 · 2 评论 -
Java中的21种锁
本篇主要内容如下:本篇主要内容本篇文章已收纳到我的Java在线文档、 Github我的SpringCloud实战项目持续更新中帮你总结好的锁:序号锁名称应用1乐观锁CAS2悲观锁synchronized、vector、hashtable3自旋锁CAS4可重入锁synchronized、Reentrantlock、Lock5读写锁ReentrantReadWriteLock,CopyOnWriteArrayList、CopyOnWriteArraySet6公平锁Reentrant.转载 2020-09-03 21:12:22 · 797 阅读 · 0 评论 -
Java之协程(quasar)
一、前面我们简单的说了一下,Python中的协程原理。这里补充Java的协程实现过程。有需要可以查看python之协程。 二、Java协程,其实做Java这么久我也没有怎么听过Java协程的东西,但是一直有有听到微线程/协程的概念,这不在学习Python的时候接触到了协程一词。然后返回来去了解Java的协程问题,但是看了很多资料,发现官网以及很多地方都没有涉及到协程的东西,没有办法,只能通过强大的社区来学习协程的相关东西。 三、这里主要关注的是:quasar。 1)协程的目的:当我们在使转载 2020-09-02 11:53:46 · 6598 阅读 · 1 评论 -
高性能队列——Disruptor
https://tech.meituan.com/2016/11/18/disruptor.html背景Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。目前,包括Apac转载 2020-08-19 09:01:01 · 414 阅读 · 0 评论 -
Thread(线程)、Fiber(纤程)、coroutine(协程) 、绿色线程(GreenThread)
计算机有进程,线程和协程。前两者大家都知道,很常见的玩意。而协程,则是基于线程之上的,自主开辟的异步任务,很多人更喜欢叫它们纤程(Fiber),或者绿色线程(GreenThread)。 进程 为了使多个程序能够并发(同一时刻只有一个在运行,但感觉起来像多个同时运行;并行(同一时刻真的多个在运行,不是感觉像多个))的执行,操作系统需要一个结构来抽象和表示这个程序的运行。进程是操作系统对一个正在运行的程序的一种抽象结构。进程是指在操作系统中能独立运行并作为资源分配的基本单位,由一组机器指令、数原创 2020-08-07 09:56:13 · 2902 阅读 · 0 评论 -
并发编程
前言提到并发编程,很多人会想到多线程;希望让多个线程共同完成一项任务,以提高生产效率。所以要聊并发编程之前,就要明白线程和进程的关系。进程:在现代操作系统中,每一个独立运行的程序都是一个进程,比如运行中的word,微信等等都是一个独立进程。线程:在现代操作系统中,线程也叫轻量级进程,每个进程里面可以包含多个线程。CPU资源可以在多个线程之间不断切换,仿佛所有线程在并行执行。每个线程都有自己的计数器,堆栈,和局部变量等属性。这些线程也能够访问共享的内存变量。这将成为日后阻碍我们写出健壮且安全的并发原创 2020-08-07 08:18:31 · 152 阅读 · 0 评论