synchronized

Are wait() and notify() unreliable despite of synchronized?

送分小仙女□ 提交于 2019-12-12 01:05:55
问题 I recently discovered that using synchronized won't prevent any dead locks. E.g. within this code: ArrayList <Job> task; ... public void do(Job job){ synchronized(tasks){ tasks.add(job); } synchronized(this){ notify(); } } public void run(){ while(true){ for (int = 0;i<tasks.size();i++){ synchronized(tasks){ Job job = tasks.get(i); } //do some job here... } synchronized(this){ wait(); //lock will be lost... notifier = false; //lock will be acquired again after notify() } } } Now, what is the

并发容器的原理,七大并发容器详解、及使用场景

我是研究僧i 提交于 2019-12-11 23:47:05
并发容器的由来 在Java并发编程中,经常听到Java集合类,同步容器、并发容器,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理清楚了,你才能真正掌握在高并发的环境下,正确使用好并发容器,我们先从Java集合类,同步容器谈起。 1.什么是同步容器 Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。 如果有多个线程并发地访问这些容器时,就会出现问题。因此,在编写程序时,在多线程环境下必须要求程序员手动地在任何访问到这些容器的地方进行同步处理,这样导致在使用这些容器的时候非常地不方便。 所以,Java先提供了同步容器供用户使用。 同步容器可以简单地理解为通过synchronized来实现同步的容器 ,比如Vector、Hashtable以及SynchronizedList等容器。 2.同步容器,主要的分类: Vector Stack HashTable Collections.synchronized方法生成 同步容器面临的问题 可以通过查看Vector,Hashtable等这些同步容器的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来, 并在需要同步的方法上加上关键字synchronized。

并发容器的原理,七大并发容器详解、及使用场景

夙愿已清 提交于 2019-12-11 22:40:49
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 并发容器的由来 在Java并发编程中,经常听到Java集合类,同步容器、并发容器,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理清楚了,你才能真正掌握在高并发的环境下,正确使用好并发容器,我们先从Java集合类,同步容器谈起。 1.什么是同步容器 Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。 如果有多个线程并发地访问这些容器时,就会出现问题。因此,在编写程序时,在多线程环境下必须要求程序员手动地在任何访问到这些容器的地方进行同步处理,这样导致在使用这些容器的时候非常地不方便。 所以,Java先提供了同步容器供用户使用。 同步容器可以简单地理解为通过synchronized来实现同步的容器 ,比如Vector、Hashtable以及SynchronizedList等容器。 2.同步容器,主要的分类: Vector Stack HashTable Collections.synchronized方法生成 同步容器面临的问题 可以通过查看Vector,Hashtable等这些同步容器的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,

Equivalence lock in Scala/Java?

左心房为你撑大大i 提交于 2019-12-11 16:19:40
问题 Is there anyway to lock on the object equality instead of referential equality in Scala/Java e.g. def run[A](id: A) = id.synchronized { println(s"Processing $id") Thread.sleep(5000) println(s"Done processing $id") } Seq(1, 1, 2, 3, 1).par.foreach(run) I want this to print something like: Processing 3 Processing 1 Processing 2 // 5 seconds later Done processing 1 Done processing 2 Done processing 3 Processing 1 // 5 seconds later Done processing 1 Processing 1 // 5 seconds later Done

你真的了解JMM吗?

谁都会走 提交于 2019-12-11 14:03:43
引言 在现代计算机中,cpu的指令速度远超内存的存取速度,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了。 基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是也为计算机系统带来更高的复杂度,因为它引入了一个新的问题:缓存一致性(Cache Coherence)。在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存(MainMemory)。当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致,举例说明变量在多个CPU之间的共享。如果真的发生这种情况,那同步回到主内存时以谁的缓存数据为准呢?为了解决一致性的问题,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作,这类协议有MSI、MESI(Illinois Protocol)、MOSI、Synapse、Firefly及Dragon Protocol等。 一、JMM(Java Memory Model) java虚拟机规范定义java内存模型屏蔽掉各种硬件和操作系统的内存访问差异

实现死锁的实例

自作多情 提交于 2019-12-11 13:44:24
package com.auth.test; /** * 死锁实例 * @author kang * @version 1.0 * @date 2019/12/6 13:21 */ public class DeadLock implements Runnable { public int flag = 1; //静态对象是类的所有对象共享的 private static Object o1 = new Object(), o2 = new Object(); @Override public void run() { System.out.println("flag:{}" + flag); if(flag == 1){ //先锁o1,在对o2加锁,环路等待条件 synchronized (o1){ try { Thread.sleep(500); } catch (Exception e) { e.printStackTrace(); } synchronized (o2){ System.out.println("1"); } } } if(flag == 0){ //先锁o2,在锁o1 synchronized (o2){ try { Thread.sleep(500); } catch (Exception e) { e.printStackTrace(); }

【多线程】如何保证线程安全

若如初见. 提交于 2019-12-11 13:29:04
一、线程安全等级 之前的博客 中已有所提及“线程安全”问题,一般我们常说某某类是线程安全的,某某是非线程安全的。其实线程安全并不是一个“非黑即白”单项选择题。按照“线程安全”的安全程度 由强到弱 来排序,我们可以将java语言中各种操作共享的数据分为以下5类: 不可变、绝对线程安全、相对线程安全、线程兼容和线程对立 。 1、不可变 在java语言中,不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施。如final关键字修饰的数据不可修改,可靠性最高。 2、绝对线程安全 绝对的线程安全完全满足Brian GoetZ给出的线程安全的定义,这个定义其实是很严格的,一个类要达到“不管运行时环境如何,调用者都不需要任何额外的同步措施”通常需要付出很大的代价。 3、相对线程安全 相对线程安全就是我们通常意义上所讲的一个类是“线程安全”的。 它需要保证对这个对象单独的操作是线程安全的,我们在调用的时候不需要做额外的保障措施,但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性。 在java语言中,大部分的线程安全类都属于相对线程安全的,例如Vector、HashTable、Collections的synchronizedCollection()方法保证的集合。 4、线程兼容

How to unit test a synchronous method in java?

允我心安 提交于 2019-12-11 13:12:55
问题 I am curious to know how to unit test a synchronous method in Java. Can we use mocking frameworks like jMockit, Mockito? I am looking for an answer for something similar to an interesting post at : http://www.boards.ie/vbulletin/showthread.php?t=2056674659 Unfortunately, instead of suggestions/answer, there were unnecesary discussions ! Thanks, Cot 回答1: I am curious to know how to unit test a synchronous method in Java. If you mean how to write a unit test to test whether a method (or class)

Lock的使用

余生颓废 提交于 2019-12-11 12:35:30
Lock是一个Java类,synchronized是一个Java关键字,两者有本质的不同 Lock需要手动释放锁,synchronized是自动释放锁 Lock适合大量同步的代码同步,synchronized适合少量代码的同步 Lock可以判断是否获得锁的状态,synchronized无法判断是否获得锁的状态   所以Lock的使用是比synchronized要灵活的,因为Lock可以多路分支通知,因为synchronized实现线程之间的通信是通过使用wait()和notify()与notifyAll()来实现线程之间的通信的,但是JVM唤醒线程是随机的不可控,Lock作为通过手动唤醒的方法,是可以做到想让谁唤醒就让谁唤醒的。 Lock通过Condition实现等待/通知 来源: https://www.cnblogs.com/samanian/p/12021083.html

你真的了解JMM吗?

怎甘沉沦 提交于 2019-12-11 08:37:05
引言 在现代计算机中, cpu的指令速度远超内存的存取速度 ,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不 加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache) 来作为内存与处理器之间的缓冲: 将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了。 基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是也为计算机系统带来更高的复杂度,因为它 引入了一个新的问题:缓存一致性(Cache Coherence) 。在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存(MainMemory)。当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致,举例说明变量在多个CPU之间的共享。如果真的发生这种情况,那同步回到主内存时以谁的缓存数据为准呢?为了解决一致性的问题,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作,这类协议有MSI、MESI(Illinois Protocol)、MOSI、Synapse、Firefly及Dragon Protocol等。 一、JMM(Java Memory Model) java虚拟机规范定义 java内存模型屏蔽掉各种硬件和操作系统的内存访问差异