java多线程
hutongling
知行合一!
展开
-
Java 多线程10:CAS 与 AtomicInteger(乐观锁)
AtomicInteger源码分析——基于CAS的乐观锁实现悲观锁与乐观锁我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时间片之间,需要进行cpu切换,也就是会发生进程的切换。切换涉及到清空寄存器,缓存数据。然后重新加载新的thread所需数据。当一个线程被挂起时,加入到阻塞队列,在一定的时间或条件下,在通过notify(),not转载 2017-04-07 21:27:07 · 308 阅读 · 0 评论 -
高并发Java 三 Java内存模型和线程安全
网上很多资料在描述Java内存模型的时候,都会介绍有一个主存,然后每个工作线程有自己的工作内存。数据在主存中会有一份,在工作内存中也有一份。工作内存和主存之间会有各种原子操作去进行同步。 但是由于Java版本的不断演变,内存模型也进行了改变。本文只讲述Java内存模型的一些特性,无论是新的内存模型还是旧的内存模型,在明白了这些特性以后,看起来也会更加清晰。1. 原子性原子性是指一个操作是不可中断的转载 2017-04-28 15:06:17 · 333 阅读 · 0 评论 -
高并发Java 四 无锁
1 无锁类的原理详解1.1 CASCAS算法的过程是这样:它包含3个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。仅当V 值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么 都不做。最后,CAS返回当前V的真实值。CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成 操作。当多个线程同时使用CAS操作一个变量时,转载 2017-04-28 15:08:58 · 526 阅读 · 0 评论 -
高并发Java 五 JDK并发包1
1. 各种同步控制工具的使用1.1 ReentrantLock ReentrantLock感觉上是synchronized的增强版,synchronized的特点是使用简单,一切交给JVM去处理,但是功能上是比较薄弱的。在JDK1.5之前,ReentrantLock的性能要好于synchronized,由于对JVM进行了优化,现在的JDK版本中,两者性能是不相上下的。如果是简单的实现,不要刻意去使用转载 2017-04-28 15:18:05 · 495 阅读 · 0 评论 -
高并发Java 六 JDK并发包2
1. 线程池的基本使用1.1.为什么需要线程池平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程。但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务。因此希望把尽可能多的cpu用在执行任务上面,而不是用在与业务无关的线程创建和销毁上面。而线程池则解决了这个问题,线程池的作用就是将线程进行复用。1.2.JDK为我们提供了哪些支持JDK中的相关转载 2017-04-28 15:31:42 · 486 阅读 · 0 评论 -
高并发Java 七 并发设计模式
1. 什么是设计模式在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题 ,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领 域引入到计算机科学的。 2. 单例模式单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为 比如:全局信息配置单例模式最转载 2017-04-28 15:50:52 · 2111 阅读 · 0 评论 -
高并发Java 八 NIO和AIO
IO感觉上和多线程并没有多大关系,但是NIO改变了线程在应用层面使用的方式,也解决了一些实际的困难。而AIO是异步IO和前面的系列也有点关系。在此,为了学习和记录,也写一篇文章来介绍NIO和AIO。什么是NIONIO是New I/O的简称,与旧式的基于流的I/O方法相对,从名字看,它表示新的一套Java I/O标 准。它是在Java 1.4中被纳入到JDK中的,并具有以下特性: NIO是基于块(转载 2017-04-28 16:01:23 · 784 阅读 · 0 评论 -
高并发Java 九 锁的优化和注意事项
1. 锁优化的思路和方法在[高并发Java 一] 前言中有提到并发的级别。一旦用到锁,就说明这是阻塞式的,所以在并发度上一般来说都会比无锁的情况低一点。这里提到的锁优化,是指在阻塞式的情况下,如何让性能不要变得太差。但是再怎么优化,一般来说性能都会比无锁的情况差一点。这里要注意的是,在[高并发Java 五] JDK并发包1中提到的ReentrantLock中的tryLock,偏向于一种无锁的方式,因转载 2017-04-28 16:06:24 · 1460 阅读 · 0 评论 -
高并发Java 十 JDK8对并发的新支持
1. LongAdder和AtomicLong类似的使用方式,但是性能比AtomicLong更好。LongAdder与AtomicLong都是使用了原子操作来提高性能。但是LongAdder在AtomicLong的基础上进行了热点分离,热点分离类似于有锁操作中的减小锁粒度,将一个锁分离成若干个锁来提高性能。在无锁中,也可以用类似的方式来增加CAS的成功率,从而提高性能。LongAdder原理图:At转载 2017-04-28 16:08:55 · 528 阅读 · 0 评论 -
ConcurrentHashMap原理分析
本文则重点介绍ConcurrentHashMap实现的细节。HashMap就不介绍了,具体请查看JDK7与JDK8中HashMap的实现HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占。ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行转载 2017-04-28 16:32:41 · 404 阅读 · 0 评论 -
ConcurrentHashMap总结
并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O)。ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,fi转载 2017-04-28 16:40:48 · 448 阅读 · 0 评论 -
高并发Java 二 多线程基础
1. 什么是线程线程是进程内的执行单元某个进程当中都有若干个线程。使用线程的原因是,进程的切换是非常重量级的操作,非常消耗资源。如果使用多进程,那么并发数相对来说不会很高。而线程是更细小的调度单元,更加轻量级,所以线程会较为广泛的用于并发设计。在Java当中线程的概念和操作系统级别线程的概念是类似的。事实上,Jvm将会把Java中的线程映射到操作系统的线程区。2. 线程的基本操作2.1 线程状态图上转载 2017-04-28 14:55:48 · 291 阅读 · 0 评论 -
高并发Java 一
1、关于高并发的几个重要概念1.1 同步和异步首先这里说的同步和异步是指函数/方法调用方面。很明显,同步调用会等待方法的返回,异步调用会瞬间返回,但是异步调用瞬间返回并不代表你的任务就完成了,他会在后台起个线程继续进行任务。1.2 并发和并行并发和并行在外在表象来说,是差不多的。由图所示,并行则是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。所以单个cpu是不能做并行的,只能转载 2017-04-28 14:47:31 · 248 阅读 · 0 评论 -
Java 多线程9:线程池实现原理
我们都知道,所谓线程池,那么就是相当于有一个池子,线程就放在这个池子中进行重复利用, 能够减去了线程的创建和销毁所带来的代价。 但是这样并不能很好的解释线程池的原理,下面从代码的角度分析一下线程池的实现。线程池的相关类对于原理,在 Java 中,有几个接口,类 值得我们关注:Executor ExecutorService AbstractExecutorService ThreadPoolE转载 2017-04-07 21:24:30 · 422 阅读 · 0 评论 -
Java 多线程7:ThreadLocal 类
什么是ThreadLocal它的作用就是为使用该变量的线程都提供一个变量值的副本,每个线程都可以独立的改变自己的副本,而不会和其他线程的副本造成冲突。从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。通过ThreadLocal存取的数据转载 2017-04-07 21:12:53 · 364 阅读 · 0 评论 -
Java 多线程6:volatile 关键字
概念volatile 也是 多线程的解决方案之一。 volatile 能够保证 可见性,但是不能保证原子性。它只能作用于变量,不能作用于方法。如何理解 volatile 能够保证可见性,参考:聊聊并发(一)深入分析Volatile的实现原理,建议看看原文:首先,需要了解一个概念:缓存行 - 缓存中可以分配的最小存储单位。当我们对 volatile 变量进行写操作的时候,把 Java 代码翻译到汇编代转载 2017-04-07 21:05:58 · 274 阅读 · 0 评论 -
Java 多线程5:synchronized 关键字用法(修饰类,方法,静态方法,代码块)
在 多线程生成的原因(Java内存模型与i++操作解析) 中,介绍了Java的内存模型,从而可能导致的多线程问题。synchronized就是避免这个问题的解决方法之一。除了 synchronized 的方式,还有 lock,condition,volatile,threadlocal,atomicInteger,cas等方式。synchronized 用法它的修饰对象有几种:修饰一个类,其作用的范转载 2017-04-07 20:54:19 · 1869 阅读 · 0 评论 -
Java 多线程4:Condition 接口
Condition 是一种更细粒度的并发解决方案。就拿生产者消费者模式来说,当仓库满了的时候,又再执行到 生产者 线程的时候,会把 该 生产者 线程进行阻塞,再唤起一个线程.但是此时唤醒的是消费者线程还是生产者线程,是未知的。 如果再次唤醒的还是生产者线程,那么还需要把它进行阻塞,再唤起一个线程,再此循环,直到唤起的是消费者线程。这样就可能存在 时间或者资源上的浪费,所以说 有了Condition转载 2017-04-07 20:43:09 · 245 阅读 · 0 评论 -
Java 多线程2:生产者消费者问题
概念生产者消费者问题描述了两个线程(即生产者线程和消费者线程),共享固定大小的缓冲区,在实际运行中可能出现的问题。生成者:生成一定量的数据放到缓冲区中,然后重复此过程。 消费者:在缓冲区消耗这些数据。 该问题的关键就是 要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。要解决该问题,就必须 让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的转载 2017-04-07 20:38:01 · 380 阅读 · 0 评论 -
Java 多线程1:多线程生成的原因(Java内存模型与i++操作解析)
Java 内存模型 线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM(Java内存模型)的一个抽象概念,并不真实存在。它涵盖了缓存,写 缓冲区,寄存器以及其 他的硬件和编译器优化。Java内存模型的抽象示意图如下图: i++操作实质对于一个简单的 i++ 操作,结转载 2017-04-07 20:35:28 · 687 阅读 · 0 评论 -
Java 多线程3:Lock 接口(接口方法分析,ReentrantLock,ReadWriteLock)
当我们了解了 多线程生成的原因 之后,会有相应的解决办法,最典型的就是 synchronized 和 lock。lock可以说是 synchronized 的一个替代品,synchronized 能做的事,lock 基本都可以做,而且能做得更好。他们的一些区别是:lock在获取锁的过程可以被中断。 lock可以尝试获取锁,如果锁被其他线程持有,则返回 false,不会使当前线程休眠。 lock在转载 2017-04-07 20:41:48 · 331 阅读 · 0 评论 -
Java 多线程8:InheritableThreadLocal 实现原理
介绍 InheritableThreadLocal 之前,假设对 ThreadLocal 已经有了一定的理解,比如基本概念,原理,如果没有,可以参考:Java 多线程:threadlocal关键字。这里再复习下 ThreadLocal 的原理,因为会对 InheritableThreadLocal 的理解 有重大的帮助:每个线程都有 一个 ThreadLocalMap 类型的 threadLocal转载 2017-04-07 21:20:30 · 449 阅读 · 0 评论 -
50道Java线程面试题
下面是Java线程相关的热门面试题,你可以用它来好好准备面试。 转载自:原文链接1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好转载 2017-04-09 17:22:51 · 253 阅读 · 0 评论 -
去除网页内容中的一些样式,包含图片的地址,样式,空格,回车,还有其他的一些特殊转义符
去除网页中的一些样式public static String removeImgUrl(String str){if (str == null){return “”;}else{// 可能存在中文的尖括号或者英文的尖括号,所以需要过滤两次return str.replaceAll("&lt", “<”).replaceAll("&gt", “&am原创 2019-01-31 10:45:56 · 351 阅读 · 1 评论