synchronized

Concurrency in Java using synchronized blocks not giving expected results

扶醉桌前 提交于 2019-12-01 18:14:28
Below is a trivial java program. It has a counter called "cnt" that is incremented and then added to a List called "monitor". "cnt" is incremented by multiple threads, and values are added to "monitor" by multiple threads. At the end of the method "go()", cnt and monitor.size() should have the same value, but they don't. monitor.size() does have the correct value. If you change the code by uncommenting one of the commented synchronized blocks, and commenting out the currently uncommented one, the code produces the expected results. Also, if you set the thread count (THREAD_COUNT) to 1, the

测试开发工程师面试总结(一)——Java基础篇

微笑、不失礼 提交于 2019-12-01 18:12:43
本文面向对象:测试开发工程师(服务端自动化方向)。 随手百度一下都能找到**岗位面试总结,但是有关测开岗位的面试总结却寥寥无几。总体原因可能是这两个:1 测试行业整体水平参差不齐,导致不同公司面试的问题不能抽象出来写概览。2 很多做测开的人可能内心对这个行业缺少热爱,所以不爱去写。 在找工作的过程中发现测开被问到的非常杂,涵盖了Java基础(因为我平时使用Java语言较多)、算法、Spring基础、Linux基本命令、测试工具selenium等。现在把以上五个方面分五篇总结。 Java基础 1. 最基础的是问到Java的基本类型,引用类型 基本类型一共有八种,六种数字类型(四个整数型两个浮点型),一种字符类型,还有一种布尔型,整数型包括byte 8位 short 16位 int 32位 long64位,字符型即char 16位的Unicode字符 ,布尔型表示一位的信息。引用类型指向一个对象,指向对象的变量就是引用变量。对象 数组都是引用类型。 2. 字符串string类和stringbuffer的区别也是经常考查到的点 String类是不可变的,如果对字符串进行修改,需要使用StringBuffer和StringBuilder。StringBuffer是线程安全的,StringBuilder在Java5中被提出,她相较于StringBuffer有速度优势但是是线程不安全的

Why can't Thread.interrupt() interrupt a thread trying to acquire lock

拟墨画扇 提交于 2019-12-01 17:45:57
In the book Thinking in Java it is written that Thread.interrupt() cannot interrupt a thread which is trying to acquire a synchronized lock, I want to know why? A blocking operation can be interrupted only if it is declared to throw InterruptedException . Clearly, a synchronized block does not declare it, therefore it is impossible to interrupt a thread while it is waiting to acquire a lock. Alternatively you can use an explicit lock and call Lock.lockInterruptibly() . The book is wrong, unless it is only referring to the synchronized keyword. Object.wait() throws InterruptedException . 来源:

一个崩溃分析

让人想犯罪 __ 提交于 2019-12-01 16:02:53
崩溃的分析 最近修复了一些iOS项目的崩溃,想分析总结一下这些崩溃的原因,以及预防。崩溃的原因一般有下面几种: 内存访问错误(这个出现的比较多,原因多种多样) 非法指令的执行(超出权限范围内的指令) 非法的IO访问 系统调用参数出错 指令条用参数错误(除以0之类) 想分析用户崩溃,收集崩溃的日志非常重要,我们项目中用的是Twitter的Crashlytics,现在叫fabric, 能够收集到比较详细的崩溃信息:各线程的崩溃栈和设备的一些信息。有一个小问题就是没有收集到各个 寄存器里面的值(看是不是我没有找到地方)。 选了出现次数最多的一个崩溃进行分析: # OS Version: 13.1.2 (17A860) # Device: iPhone 8 # RAM Free: 1.9% # Disk Free: 15.7% #24. Crashed: NSOperationQueue 0x107964a70 (QOS: UNSPECIFIED) 0 libobjc.A.dylib 0x1b394f150 objc_release + 16 1 _appstore 0x10184b694 -[YNP_VRHomeCoreViewModel voiceRoomDidChangeSpeakingUser:] + 373 (YNP_VRHomeCoreViewModel.m:373) 2

多线程

岁酱吖の 提交于 2019-12-01 15:38:55
1.同步方法和非同步方法是否可以同时调用 可以同时调用,可以理解为不加synchronized的方法无视这个对象的锁 int count=10; public synchronized void m1(){ count--; System.out.println(Thread.currentThread().getName()+"m1 started 01 : "+count); try { Thread.sleep(10000L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"m1 started 02 : "+count); } public /*synchronized*/ void m2(){ try { count--; Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"m2 start ..."+count); } public static void main(String[]

synchronized block on grails works on windows but no in linux

六月ゝ 毕业季﹏ 提交于 2019-12-01 14:45:09
I have a grails application that relies on a synchronized block into a service. When I run it on windows the synchronization works as expected but when I run on ams linux a get a StaleObjectStateException. The problem is reproduced in the following example. class TestService { private final Object $lock = new Object[0]; TesteSync incrementa() { synchronized ($lock) { TesteSync t = TesteSync.findById(1) t.contador++ t.save(flush: true) Thread.sleep(10000) return t } } } In my understand, this exception occurs because multiple threads are trying to save the same object. That's why I'm using a

如何避免死锁

*爱你&永不变心* 提交于 2019-12-01 13:17:19
并发程序一旦死锁,往往我们只能重启应用。解决死锁问题最好的办法就是避免死锁。 死锁发生的条件 互斥,共享资源只能被一个线程占用 占有且等待,线程 t1 已经取得共享资源 s1,尝试获取共享资源 s2 的时候,不释放共享资源 s1 不可抢占,其他线程不能强行抢占线程 t1 占有的资源 s1 循环等待,线程 t1 等待线程 t2 占有的资源,线程 t2 等待线程 t1 占有的资源 避免死锁的方法 对于以上 4 个条件,只要破坏其中一个条件,就可以避免死锁的发生。 对于第一个条件 "互斥" 是不能破坏的,因为加锁就是为了保证互斥。 其他三个条件,我们可以尝试 一次性申请所有的资源,破坏 "占有且等待" 条件 占有部分资源的线程进一步申请其他资源时,如果申请不到,主动释放它占有的资源,破坏 "不可抢占" 条件 按序申请资源,破坏 "循环等待" 条件 使用管理类一次性申请所有的资源,破坏 "占有且等待" 条件示例 package constxiong.concurrency.a023; import java.util.HashSet; import java.util.Set; /** * 测试 一次性申请所有的资源,破坏 "占有且等待" 条件示例 * @author ConstXiong * @date 2019-09-24 14:04:12 */ public class

Java 中锁之间的对比

◇◆丶佛笑我妖孽 提交于 2019-12-01 13:15:12
synchronized 和 java.util.concurrent.lock.Lock 之间的区别 实现层面不一样。synchronized 是 Java 关键字,JVM层面 实现加锁和释放锁;Lock 是一个接口,在代码层面实现加锁和释放锁 是否自动释放锁。synchronized 在线程代码执行完或出现异常时自动释放锁;Lock 不会自动释放锁,需要在 finally {} 代码块显式地中释放锁 是否一直等待。synchronized 会导致线程拿不到锁一直等待;Lock 可以设置尝试获取锁或者获取锁失败一定时间超时 获取锁成功是否可知。synchronized 无法得知是否获取锁成功;Lock 可以通过 tryLock 获得加锁是否成功 功能复杂性。synchronized 加锁可重入、不可中断、非公平;Lock 可重入、可判断、可公平和不公平、细分读写锁提高效率 java.util.concurrent.lock.Lock 与 java.util.concurrent.lock.ReadWriteLock 之间的区别 ReadWriteLock 定义了获取读锁和写锁的接口,读锁之间不互斥,非常适合读多、写少的场景 适用场景 JDK 1.6 开始,对 synchronized 方式枷锁进行了优化,加入了偏向锁、轻量级锁和锁升级机制,性能得到了很大的提升。性能与

java锁介绍

白昼怎懂夜的黑 提交于 2019-12-01 13:14:36
1.乐观锁和悲观锁 乐观锁:读多写少,读数据默认其他线程不会修改该数据,默认不上锁,但是在更新的时候在该期间判断数据有没有更新。(在写时读取版本号,若发生改变,则重新读取--比较--修改) 悲观锁:写少读多,每次读写操作的时候都会上锁。 如Synchronized是悲观锁,AQS框架下的锁(ReenTrantLock)则先尝试cas乐观锁去获取锁,获取不到则会转换为悲观锁 注:AQS框架指提供了一种实现阻塞锁和一系列依赖的FIFO等待队列同步器框架 2.自旋锁 持有锁的线程在很短的时间内释放资源,等待竞争的线程不需要进入阻塞状态,只需要等待一定的时间(自旋)等持有锁的线程释放锁即可立即获取锁,避免用户进行和内河的切换消耗 注:1.如果在设置等待的最大时间内仍然没有释放锁,则会停止自旋进入阻塞状态 2.若持有锁的线程需要长时间占有锁,则不适合用自旋锁 3.公平锁和非公平锁 公平锁:公平锁指的是锁的分配机制是公平的。加锁前检查是否有排队的等待线程,先到先得 非公平锁:按随机、就近原则分配的锁机制称为不公平锁。加锁前不考虑排队等待问题,直接尝试获取,获取不到自动到队尾等待, 注:1.非公平锁性能比公平锁高5到10倍。因为公平锁需要在多核的情况下维护一个队列 2.synchronized是非公平锁,ReentrantLock默认的lock()方法采用的是非公平锁 4.共享锁和独占锁 独占锁

Java中的锁

不问归期 提交于 2019-12-01 13:11:32
在并发编程中,经常会遇到多个线程访问同一个共享变量,当同时对共享变量进行读写操作时,就会产生数据不一致的情况。 为了解决这个问题 JDK 1.5 之前,使用 synchronized 关键字,拿到 Java 对象的锁,保护锁定的代码块。JVM 保证同一时刻只有一个线程可以拿到这个 Java 对象的锁,执行对应的代码块。 JDK 1.5 开始,引入了并发工具包 java.util.concurrent.locks.Lock,让锁的功能更加丰富。 常见的锁 synchronized 关键字锁定代码库 可重入锁 java.util.concurrent.lock.ReentrantLock 可重复读写锁 java.util.concurrent.lock.ReentrantReadWriteLock Java 中不同维度的锁分类 可重入锁 指在同一个线程在外层方法获取锁的时候,进入内层方法会自动获取锁。JDK 中基本都是可重入锁,避免死锁的发生。上面提到的常见的锁都是可重入锁。 公平锁 / 非公平锁 公平锁,指多个线程按照申请锁的顺序来获取锁。如 java.util.concurrent.lock.ReentrantLock.FairSync 非公平锁,指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程先获得锁。如 synchronized、java.util