synchronized

并发知识点

有些话、适合烂在心里 提交于 2019-12-05 06:52:37
1、线程与进程 1. 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 2. 一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。 3. 区别不同 进程是资源分配的最小单位,线程是程序执行的最小单位。 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响

Java多线程之线程安全

本秂侑毒 提交于 2019-12-05 06:44:24
   当多条语句在操作同一个线程共享数据的时候,一个线程对多条语句只执行了一部分,还没有执行完的时候,另外一个线程参与进来执行。导致线程共享数据出现错误。例如在对同一个账户进行取款时,账户余额为1000元,A某个时刻正在取走1000元时,B也参与进来取走1000元,此时,账户余额就会出现错误,这就是线程安全的问题。   解决这类安全问题,我们只能让一个线程都执行完,执行过程中其他线程不得参与进来。完毕后,再让另一条线程执行进来。Java对于这种多线程的安全问题提供了专业的解决方式:同步机制。本文就是介绍几种解决方式。 1、同步锁    在讲到方法之前不得不先提到同步锁机制。   "对于并发工作,你需要某种方式来防止两个任务访问相同的资源。防止这种冲突的方法就是当资源被一个任务使用时,在其加上锁。第一个访问某项资源的任务时必须锁定这项资源,使其他任务在被解锁之前,就无法访问它了,而在其被解锁之时,另一个任务就可以锁定使用它了"引用至《Thinking in Java》   说到底synchronized锁(同步锁)可以是任意对象。所有的对象都自动含有单一的锁。也可以叫做监视器。必须保证使用同一个资源的多个线程共用一把锁。否则无法保证共享资源的安全。 2、 同步代码块 synchronized(对象){ 需要被同步的代码} 对于同步代码块而言。synchronized锁可以自己指定

说说你对synchronized同步块的了解吧?

旧城冷巷雨未停 提交于 2019-12-05 05:35:00
synchronized关键字用来实现在并发编程中线程间的同步,synchronized相对于volatile关键字实现的是基于对象锁的同步,在java中每个对象都可以同步的锁。synchronized支持有实例方法、静态方法、实例方法中的同步块、静态方法中的同步块。 参考资料: 聊聊并发(二)Java SE1.6中的Synchronized 对于同步方法,锁是当前实例对象。 对于静态同步方法,锁是当前对象的Class对象。 对于同步方法块,锁是Synchonized括号里配置的对象。 4 同步的原理 JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现,而方法同步是使用另外一种方式实现的,细节在JVM规范里并没有详细说明,但是方法的同步同样可以使用这两个指令来实现。monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处, JVM要保证每个monitorenter必须有对应的monitorexit与之配对。任何对象都有一个 monitor 与之关联,当且一个monitor 被持有后,它将处于锁定状态。线程执行到 monitorenter 指令时,将会尝试获取对象所对应的 monitor 的所有权

什么情况下导致线程死锁,遇到线程死锁该怎么解决?

房东的猫 提交于 2019-12-05 05:27:12
1、死锁的定义     所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进 2、死锁产生的必要条件     互斥条件:线程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个线程所占有。此时若有线程请求该资源,则请求线程只能等待。     不剥夺条件:线程所获得的资源在未使用完毕之前,不能被其他线程倾向夺走,即只能由获得该资源的线程自己来释放(只能是主动释放)。     请求和保持条件:线程已经保持了至少一个资源,但又提出了新的资源请求,而该线程已被其他线程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。     循环等待条件:存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个线程所请求。即存在一个处于等待状态的线程集合{P1,P2,...,Pn},其中Pi等待的资源被P(i+1)占有(i=0,1,..,n-1),Pn等待的资源被P0占有,如下图。 3、产生死锁的一个例子 /** * 一个简单的死锁类 * 当DeadLock类的对象flag==1时(td1),先锁定o1,睡眠500ms * 而td1在睡眠的时候另一个flag==0的对象(td2)线程启动,先锁定o2,睡眠500ms * td1 睡眠结束后需要锁定 o2 才能继续执行,而此时 o2 已被 td2 锁定; * td2

Java学习之路

落爺英雄遲暮 提交于 2019-12-05 05:26:08
一、基础篇   JVM   JVM内存结构   堆、栈、方法区、直接内存、堆和栈区别   Java内存模型   内存可见性、重排序、顺序一致性、volatile、锁、final   垃圾回收   内存分配策略、垃圾收集器(G1)、GC算法、GC参数、对象存活的判定   JVM参数及调优   Java对象模型   oop-klass、对象头   HotSpot   即时编译器、编译优化   类加载机制   classLoader、类加载过程、双亲委派(破坏双亲委派)、模块化(jboss modules、osgi、jigsaw)   虚拟机性能监控与故障处理工具   jps, jstack, jmap、jstat, jconsole, jinfo, jhat, javap, btrace、TProfiler   编译与反编译   javac 、javap 、jad 、CRF   Java基础知识   阅读源代码   String、Integer、Long、Enum、BigDecimal、ThreadLocal、ClassLoader & URLClassLoader、ArrayList & LinkedList、 HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap、HashSet & LinkedHashSet &

集合家族——stack

别来无恙 提交于 2019-12-05 05:21:15
一、概述   在 Java 中 Stack 类表示 后进先出 (LIFO)的对象堆栈。栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的   它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确 定到堆栈顶距离的 search 方法。   因为它继承自Vector,那么它的实现原理是以 数组 实现堆栈的。 二、继承关系   java.lang.Object 继承者 java.util.AbstractCollection<E> 继承者 java.util.AbstractList<E> 继承者 java.util.Vector<E> 继承者 java.util.Stack<E> 所有已实现的接口: Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess 三、Stack 对 Vector 进行扩展的五个操作 四、源码分析 public class Stack<E> extends Vector<E> { /** * 创建一个空堆栈。 */ public Stack() { } /** * 把项压入堆栈顶部

Java专业术语

孤人 提交于 2019-12-05 04:48:16
StringBuilder和StringBuffer的区别 StringBuilder是非线程安全的,StringBuffer是线程安全的。具体可以看一下StringBuffer的源码,会发现StringBuffer里的方法都被synchronized修饰。 什么是线程安全 多线程在访问同一资源的情况下,可能会产生数据缺失、数据不一致等问题。 什么是死锁 死锁指当某一个线程A正在占用临界区资源的使用权,并须要另外一临界区资源才能完成,而另一临界资源被线程B占有,且需要线程A资源才能完成。会导致这两个线程都在等待对方释放临界资源,而互不相让,从而产生死锁。存在临界资源是产生死锁的必要条件。 synchronized的实现原理 保证一个共享资源在同一时间只会被一个线程访问到时,可以在代码中使用synchronized关键字对类或者对象加锁。 5.synchronized和volatile区别 使用volatile关键字可是使线程之间的数据修改可见。并可以禁止指令重排 synchronized的锁优化处理 锁消除 JMM 是什么 java memory model java内存模型? 8.java并发包都有哪些 java.util.concurrent包 包括 locks、atomic、executor、collections、tools locks部分:包含在java.util

【并发编程】synchronized的使用场景和原理简介

丶灬走出姿态 提交于 2019-12-05 04:38:58
1. synchronized使用 1.1 synchronized介绍 在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。 synchronized可以修饰普通方法,静态方法和代码块。 当synchronized修饰一个方法或者一个代码块的时候,它能够保证在同一时刻最多只有一个线程执行该段代码。 对于普通同步方法,锁是当前实例对象(不同实例对象之间的锁互不影响)。 对于静态同步方法,锁是当前类的Class对象。 对于同步方法块,锁是Synchonized括号里配置的对象。 当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。 1.2 使用场景 synchronized最常用的使用场景就是多线程并发编程时线程的同步。这边还是举一个最常用的列子:多线程情况下银行账户存钱和取钱的列子。 public class SynchronizedDemo { public static void main(String[] args) { BankAccount myAccount = new BankAccount("accountOfMG",10000.00); for(int i=0;i<100;i++){ new

deadlock on synchronized ( String intern())

懵懂的女人 提交于 2019-12-05 04:15:19
I user sun jdk 1.5 ThreadPoolExecutor( 24, 24,60,TimeUnit.SECONDS, new LinkedBlockingQueue()). soemtime I use jdb tool to find the status of all threads in thread pool are " waiting in a monitor", the code is : String key = getKey(dt.getPrefix(), id); synchronized (key.intern()) { -----> Is there a problem in "synchronized (key.intern()) " ? I get following informatnio using jdb tool, the status of 24 threads is "waiting in a monitor", it means 24 threads are deadlock at "key.intern()". (java.lang.Thread)0x28 pool-3-thread-2 waiting in a monitor (java.lang.Thread)0x27 pool-3-thread-3 waiting

Why Volatile is behaving weirdly

偶尔善良 提交于 2019-12-05 03:32:27
I have experience this weird behavior of volatile keyword recently. As far as i know, volatile keyword is applied on to the variable to reflect the changes done on the data of the variable by one thread onto the other thread. volatile keyword prevents caching of the data on the thread. I did a small test........ I used an integer variable named count, and used volatile keyword on it. Then made 2 different threads to increment the variable value to 10000, so the end resultant should be 20000. But thats not the case always, with volatile keyword i am getting not getting 20000 consistently, but