随笔分类 - 多线程与并发
多线程和并发知识
摘要:阻塞和非阻塞说的是线程发起IO操作时,如果数据没有就绪,线程是否挂起。线程不挂起的是非阻塞; 同步异步说的是,应用程序与内核交互时,数据从内核空间到用户空间的拷贝,是内核主动发起还是由应用程序来触发。内核主动发起的是异步;
阅读全文
摘要:并发编程解决的三个核心问题 1)分工 <!--?xml version="1.0" encoding="UTF-8"?--> 分工指的是如何高效地拆解任务并分配给线程 2)同步 <!--?xml version="1.0" encoding="UTF-8"?--> 同步指的是线程之间如何协作 3)互
阅读全文
摘要:一、定义: 不变模式:为了能尽可能地去除那些同步操作,提高并行程序性能,可以使用一种不可改变的对象,依靠对象的不变性,可以确保其在没有同步操作的多线程环境中依然始终保持内部状态的一致性和正确性。 不变模式天生就是多线程友好的,它的核心思想是,一个对象一旦被创建,则它的内部状态将永远不会发生改变。所以
阅读全文
摘要:一、单例模式的好处 1.对于频繁使用的对象,可以省略new操作花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销; 2.由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。 一、单例模式的好处 1.对于频繁使用的对象,可以省略new操作花费的时
阅读全文
摘要:在众多的应用程序中,使用锁的情况一般要多于无锁。因为对于应用来说,如果业务逻辑很复杂,会极大增加无锁的编程难度。但如果使用锁,我们就不得不对一个新的问题引起重视——那就是死锁。 那什么是死锁呢?通俗的说,死锁就是两个或者多个线程,相互占用对方需要的资源,而都不进行释放,导致彼此之间都相互等待对方释放
阅读全文
摘要:对于并发控制而言, 锁是一种悲观的策略。它总是假设每一次的临界区操作会产生冲突,因此,必须对每次操作都小心翼翼。如果有多个线程同时需要访问临界区资源,就宁可牺牲性能让线程进行等待,所以说锁会阻塞线程执行。 而无锁是一种乐观的策略,它会假设对资源的访问是没有冲突的。既然没有冲突,自然不需要等待,所以所
阅读全文
摘要:一、ThreadLocal介绍 这是一个线程的局部变量。也就是说,只有当前线程可以访问。既然是只有当前线程可以访问的数据,自然是线程安全的。 为每一个线程分配不同的对象,需要在应用层面保证。ThreadLocal只是起到了简单的容器作用。 一、ThreadLocal介绍 这是一个线程的局部变量。也就
阅读全文
摘要:“锁”的竞争必然会导致程序的整体性能下降,以下就是为了降低这种辐作用的建议: 1.减小锁持有时间 如果线程持有锁的时间很长,那么相对地,锁的竞争程度也就越激烈。程序开发应该尽可能地减少对某个锁的占有时间,以减少线程间互斥的可能. public synchronized void syncMethod
阅读全文
摘要:除了提供诸如同步控制,线程池等基本工具外,为了提高开发人员的效率,JDK已经为我们准备了一大批好用的并发容器,这些容器都是线程安全的,可以大大减少开发工作量。你可以在里面找到链表、HashMap、队列等。你可以在里面找到链表、HashMap、队列等。 JDK提供的这些容器大部分在java.util.
阅读全文
摘要:一、CAS简单介绍 CAS:Compare and Swap, 翻译成比较并交换。 java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。synchronouse是一种悲观锁,它会导致其他所有需要锁的线程挂起。 一、CAS简单介绍 CAS:Co
阅读全文
摘要:由于java的CAS同时具有 volatile 读和volatile写的内存语义,因此Java线程之间的通信现在有了下面四种方式: A线程写volatile变量,随后B线程读这个volatile变量。 A线程写volatile变量,随后B线程用CAS更新这个volatile变量。 A线程用CAS更新
阅读全文
摘要:一、核心线程池内部实现 为了能够更好地控制多线程,JDK提供了一套Executor框架,帮助开发人员有效地进行线程控制,其本质就是一个线程池。它的核心成员如图 以上成员均在java.util.concurrent包中,是JDK并发包的核心类。其中ThreadPoolExecutor表示一个线程池。E
阅读全文
摘要:一.synchronized的功能扩展:重入锁(java.util.concurrent.locks.ReentrantLock) 重入锁可以完全替代synchronized关键字。在JDK 5.0的早期版本中,重入锁的性能远远好于synchronized,但从JDK 6.0开始,JDK在syn-c
阅读全文
摘要:初始线程:1.新建线程 1)继承Thread类 2)实现Runnable接口2.线程终止 除非你很清楚你在做什么,否则不要随便使用stop()方法来停止一个线程。因为stop()方法太过于暴力,强行把执行到一半的线程终止,可能会引起一些数据不一致的问题。 通过定义标记变量stopme,当stopme
阅读全文
摘要:使用并行程序处于两个目的。第一,为了获得更好的性能;第二,由于业务模型的需要,确实需要多个执行实体。 一、Amdahl定律 Amdahl定律是计算机科学中非常重要的定律。它定义了串行系统并行化后的加速比的计算公式和理论上限。 加速比定义:加速比=优化前系统耗时/优化后系统耗时 即,所谓加速比,就是优
阅读全文
摘要:JMM的关键技术点都是围绕着多线程的原子性、可见性和有序性来建立的 一、原子性(Atomicity) 原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 比如,对于一个静态全局变量int i,两个线程同时对它赋值,线程A给他赋值1,线程B给它赋值
阅读全文
摘要:一、同步(Synchronous)和异步(Asynchronous) 同步和异步通常用来形容一次方法调用。同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中
阅读全文
摘要:多线程(JDK1.5的新特性互斥锁)(掌握)1.同步·使用ReentrantLock类的lock()和unlock()方法进行同步2.通信·使用ReentrantLock类的newCondition()方法可以获取Condition对象·需要等待的时候使用Condition的await()方法, 唤
阅读全文
摘要:Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能
阅读全文