在Java并发编程实践中4.4中提到向客户端加锁的方法.此为验证示例,写的不好,但可以看出结果来. package com.blackbread.test; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public…
最近阅读了<Java并发编程实践>这本书,总结了一下几个相关的知识点. 线程安全 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的.可以通过原子性.一致性.不可变对象.线程安全的对象和加锁保护同时被多个线程访问的可变状态变量来解决线程安全的问题. 可见性 在没有同步的情况下,编译器.处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整.在缺乏足够同步的多…
阅读<Java并发编程实践>一书后整理的思维导图.…
依据<Java并发编程实践>一书整理的思维导图.…
依据<Java并发编程实践>一书整理的思维导图. 第一部分: 第二部分:…
文章转自:http://kenwublog.com/java-concurrency-in-practise-note 1, 保证线程安全的三种方法 :a, 不要跨线程访问共享变量b, 使共享变量是 final类型的c, 将共享变量的操作加上同步 2, 一开始就将类设计成线程安全的 , 比在后期重新修复它 ,更容易 . 3, 编写多线程程序 , 首先保证它是正确的 , 其次再考虑性能 . 4, 无状态或只读对象永远是线程安全的 . 5, 不要将一个共享变量裸露在多线程环境下 (无同步或不可变性保…
Java 5.0 adds ConcurrentHashMap, a replacement for synchronized hash-based Map implementations, and CopyOnWriteArrayList, a replacement for synchronized List implementations for cases where traversal is the dominant operation. The new ConcurrentMap i…
众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试中必问的题,一个好的Java程序员是必须对并发编程这块有所了解的. 并发必须知道的概念 在深入学习并发编程之前,我们需要了解几个基本的概念. 同步和异步 同步和异步用请求返回调用的方式来理解相对简单. 同步:可以理解为发出一个请求后,必须等待返回结果才能执行后续的操作. 异步:请求发出后,不需要等待返回结果,可以继续执行后续操作,异步请求更像是在另一个 “空间” 中处理请求的结果,这个过程不会影响请求方的其他操作. 举个生活中的…
一,JDK并发包实际上就是指java.util.concurrent包里面的那些类和接口等 主要分为以下几类: 1,原子量:2,并发集合:3,同步器:4,可重入锁:5,线程池 二,原子量 原子变量主要有AtomicInteger,AtomicLong,AtomicBoolean等, 主要实现原理都是底层实现类CAS 即比较并交换,都有get,set,compareAndSet等方法,如++,--等也都是有自带方法实现 这些都是线程安全的,保证了多线程访问时候的可见性 import java.ut…
同步容器 同步容器是指那些对所有的操作都进行加锁(synchronize)的容器.比如Vector.HashTable和Collections.synchronizedXXX返回系列对象: 可以看到,它的绝大部分方法都被加了同步(带个小时钟图标). 虽然Vector这么劳神费力地搞了这么多同步方法,但在最终使用的时候它并不一定真的"安全". 同步容器的复合操作不安全 虽然Vector的方法增加了同步,但是像下面这种"先检查再操作"复合操作其实是不安全的: //两个同…
2.线程的安全性 2.1什么是线程安全 在多个线程访问的时候,程序还能"正确",那就是线程安全的. 无状态(可以理解为没有字段的类)的对象一定是线程安全的. 2.2 原子性 典型的例子,多线程状态下的i++是不安全的.因为i++其实是分很多步骤实现的,多个线程的执行过程可能会相互混乱. 竞态条件(Race Conditions) 线程与线程之间需要依赖于执行顺序来保证执行结果的正确性.那么就会发生竞态条件.例如在A线程中设置一个值,然后通过另外一信号变量通知给另外一个线程来读.这种协调…
1.创建线程的方式: /** * StudySjms * <p> * Created by haozb on 2018/2/28. */ public class ThreadDemo extends Thread { /** * 定义线程的名字 * @param name */ public ThreadDemo(String name) { super(name); } @Override public void run() { ; i < ; i++) { System.out.p…
1.并发 分工:如何高效地拆解任务并分配给线程 同步:线程之间如何协作 互斥:保证同一时刻只允许一个线程访问共享资源 Fork/Join 框架就是一种分工模式,CountDownLatch 就是一种典型的同步方式,而可重入锁则是一种互斥手段. 2.可见性.原子性.有序性 (1)可见性:缓存导致 (2)原子性:线程切换 count+=1 (3)有序性:编译优化 3.java内存模型 (1)可见性:缓存导致-----按需禁用缓存 (2)有序性:编译优化-----按需禁用 volatile int x…
1. 基本概念 程序,是一组有序的静态指令,是一种静态的概念.程序的封闭性是指程序一旦运行,其结果就只取决于程序本身:程序的再现性是指当机器在同一数据集上重复执行同一程序时,机器内部的动作系列完全相同,最后获得的结果也相同. 进程,是一种活动,它是由一个动作系列组成,每个动作是在某个数据集上执行一段程序,整个活动结果是提供一处系统或用户功能.进程一般由三部分组成:程序.数据集合.进程控制块(PCB).进程具有并发性和不确定性. 线程,是一个进程内部的顺序控制流.线程本身不能独立运行,必须在进程中…
Executor与Task的耦合性 1,除非线程池很非常大,否则一个Task不要依赖同一个线程服务中的另外一个Task,因为这样容易造成死锁: 2,线程的执行是并行的,所以在设计Task的时候要考虑到线程安全问题.如果你认为只会在单任务线程的Executor中运行的话,从设计上讲这就已经耦合了. 3,长时间的任务有可能会影响到其他任务的执行效率,可以让其他线程在等待的时候限定一下等待时间.不要无限制地等待下去. 确定线程池的大小 给出如下定义: 要使CPU达到期望的使用率,线程池的大小应设置为:…
任务的取消 中断传递原理 Java中没有抢占式中断,就是武力让线程直接中断. Java中的中断可以理解为就是一种简单的消息机制.某个线程可以向其他线程发送消息,告诉你“你应该中断了”.收到这条消息的线程可以根据这个消息做出反应. 意思是,不是你说让我停我就会停,我愿意停就停! 中断消息的传递其实就是通过Thread的一个布尔类型中断状态变量实现的. 发送中断请求时,线程的中断变量被设置为true: Thread t = new Thread(new Runnable() { @Override…
Java Thread中, join()方法主要是让调用该方法的thread在完成run方法里面的部分后, 再执行join()方法后面的代码 例如:定义一个People类,run方法是输出姓名年龄. class People implements Runnable{ public String name ; public int age; public People(String name , int age){ this.name =name; this.age = age; } @Overr…
1,什么是线程安全性? 简单概括就是一个类在多线程情况下能安全调用就是线程安全 2,Servlet  的线程安全性  默认是非线程安全的,写servlet代码的时候需要注意线程安全,注意同步 3,volatile volatile实际上是保证了多线程情况下,有读取,有写入,保证了读取的都是最新的值. 开发中一般boolean值 开关灯用它定义. volatile的原理如下:不用volatile修饰的变量再多线程情况下, 每个线程会有一个变量从内存备份放在cpu储存上,每次都是读取这个备份的值 但…
任务的定义 大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元.   任务的执行策略 1.顺序的执行任务 这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任务都要等待处理.响应性很糟糕,吞吐量低.系统资源利用率低. 2.显示的为任务创建线程 为每个任务创建对应一个线程,响应快,系统资源利用路高.缺点是资源消耗量大,如果有大量任务要执行的话,系统迟早会因为无限制创建过多的线程而造成内存耗尽.特别当创建的线程数量远远大于系统的CPU核数,由于每一个核同一时…
同步策略:在共享资源上面加锁 java监视器模式:class对象-与之对应的锁(内置锁)[对象锁与class锁] 执行策略: 取消策略: ============================================…
类似于Web服务器这种多任务情况时,不可能只用一个线程来对外提供服务.这样效率和吞吐量都太低. 但是也不能来一个请求就创建一个线程,因为创建线程的成本很高,系统能创建的线程数量是有限的. 于是Executor就出现 了. Executor框架 线程池的意义 线程创建太少了浪费服务器资源,另外线程创建多了又搞得服务器很累.两个极端的结果都是对外的吞吐量上不去. 所以线程是需要统一管理的,不能随便new Thread().start(). Executor提供了四种线程池. ExecutorServ…
本文在 Java线程面试题 Top 50的基础上,对部分答案进行进行了整理和补充,问题答案主要来自<Java编程思想(第四版)>,<Java并发编程实战>和一些优秀的博客,当然还有我个人的拙见,添加部分大多用不同颜色进行了区别以方便阅读. 前言 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.…
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等.他们的关系为: 并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Executor.execute(Runnalbe) .Executor在执行时使用内部的线程池完成操作. 一.创建线程池…
闭锁 一种可以延迟线程的进度直到其到达终止状态.可以用来确保某些活动直到其他活动都完成后才继续执行 例如: 确保某个计算在其需要的所有资源都被初始化了之后才继续执行. 确保某个服务在其他依赖的服务都启动了之后才开始执行 等待某个操作的所有参与者(如LOL) 都就绪了之后再继续执行. 锁的实现 1.CountDownLatch CountDownLatch 是一种灵活的闭锁实现. 可以在以上的各种类型情况下使用.它可以使一个或多个线程等待一组事件的发生. 闭锁状态包括一个计数器,该计数器被初始化为…
简单使用Lock锁 Java5中引入了新的锁机制--Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接口有3个实现它的类:ReentrantLock.ReetrantReadWriteLock.ReadLock和ReetrantReadWriteLock.WriteLock,即重入锁.读锁和写锁.lock必须被显式地创建.锁定和释放,为了可以使用更多的功能,一般用ReentrantLock为其实例化…
由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识. 一.内存模型的相关概念 Java内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存.线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作.并且每个线程不能访问其他线程的工作内存. 在java中,执行下面这个语句: int i=3; 执行线程必须先在自己的工作线程中对变量i所在的缓存行进行赋值操作,然后再写入主存当中.而不是直接将…
一.概述 在执行并发任务时,我们可以把任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程,只要池里有空闲的线程,任务就会分配一个线程执行.在线程池的内部,任务被插入一个阻塞队列(BlockingQueue),线程池里的线程会去取这个队列里的任务. 利用线程池有三个好处: 降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗 提高响应速度.当任务到达时,任务可以不需要的等到线程创建就能立即执行 提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,…
我是不是学了一门假的java...... 引言:在Java中看似顺序的代码在JVM中,可能会出现编译器或者CPU对这些操作指令进行了重新排序:在特定情况下,指令重排将会给我们的程序带来不确定的结果..... (带来个毛的不确定,他奶奶的多线程只存在于学习Java基础,实际工作中用的很少,除非是自己造轮子:所以我写这个算不算咸吃萝卜淡操心捏?) 本文大部分来自于:Java内存访问重排序的研究,想看原作请移步. 如下代码可能的结果有哪些? public class PossibleReorderin…
一.同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector.HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并在需要同步的方法上加上关键字synchornized. 另一个是Collections类中提供的静态工厂方法创建的同步包装类. 同步容器都是线程安全的.但是对于复合操作(迭代.缺少即加入.导航:根据一定的顺序寻找下一个元素),有时可能需要使用额外的客户端加锁进行保护.在一个同步容器中,复合操作是安全…
相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Android多线程(一)线程池 Android多线程(二)AsyncTask源代码分析 前言 有时仅仅为了读写一个或者两个实例域就使用同步的话,显得开销过大,volatile关键字为实例域的同步訪问提供了免锁的机制.假设声明一个域为volatile,那么编译器和虚拟机就知道该域是可能被还有一个线程并发更新的. 再讲到volatile关键字之前我们须要了解一下内存模型的相关概念以及并发编程中的三个特性:原子性,可见…