synchronized

Java面试官最爱问的volatile关键字

血红的双手。 提交于 2019-12-29 23:11:16
在Java的面试当中,面试官最爱问的就是volatile关键字相关的问题。经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用volatile关键字作为切入点呢? 为什么爱问volatile关键字 爱问volatile关键字的面试官,大多数情况下都是有一定功底的,因为volatile作为切入点,往底层走可以切入Java内存模型(JMM),往并发方向走又可接切入Java并发编程,当然,再深入追究,JVM的底层操作、字节码的操作、单例都可以牵扯出来。 所以说懂的人提问题都是有门道的。那么,先整体来看看volatile关键字都设计到哪些点:内存可见性(JMM特性)、原子性(JMM特性)、禁止指令重排、线程并发、与synchronized的区别……再往深层次挖,可能就涉及到字节码、JVM等。 不过值得庆幸的是,如果你已经学习了微信公众号“程序新视界”JVM系列的文章,上面的知识点已经不是什么问题了,权当是复习了。那么,下面就以面试官提问的形式,在不看答案的情况下,尝试回答,看看学习效果如何。夺命连环问,开始…… 面试官:说说volatile关键字的特性 被volatile修饰的共享变量,就具有了以下两点特性: 保证了不同线程对该变量操作的内存可见性; 禁止指令重排序; 回答的很好,点出了volatile关键字两大特性

String StringBuffer StringBuilder AbstractStringBuilder的关联和源码解析

纵然是瞬间 提交于 2019-12-29 21:35:16
目录 前言 概括 StringBuffer类 StringBuilder类 AbstractStringBuilder 后话 前言 相信很多程序员在使用String、StringBuilder和StringBuffer的时候都知道怎么使用,却并不会去看其原理,这里我就整理一下自己的观看心得,如有不足,多多海涵哈! 在学习这三个类之前先认识一下CharSequence接口和Appendable接口: CharSequence接口 ,出自于JDK1.4,有如下几个常用的方法: int length(); 返回字符序列长度 char charAt(int index); 返回字符序列在指定索引处的字符 CharSequence subSequence(int start, int end); 截取字符序列从索引start到end之间的值。包括start不包括end。例如:长度为5的字符序列“12345”,截图0到3的值为“123”,即真正的返回值为索引start到end-1之间的值。 Appendable接口 ,出自JDK1.5,有如下几个常用方法: Appendable append(CharSequence csq) throws IOException; 拼接字符序列 Appendable append(CharSequence csq, int start, int end)

Java 高并发五:JDK并发包1详细介绍

女生的网名这么多〃 提交于 2019-12-29 06:06:14
转自: https://www.jb51.net/article/92363.htm 1.1.1 ReentrantLock ReentrantLock感觉上是synchronized的增强版,synchronized的特点是使用简单,一切交给JVM去处理,但是功能上是比较薄弱的。在JDK1.5之前,ReentrantLock的性能要好于synchronized,由于对JVM进行了优化,现在的JDK版本中,两者性能是不相上下的。如果是简单的实现,不要刻意去使用ReentrantLock。 相比于synchronized,ReentrantLock在功能上更加丰富,它具有可重入、可中断、可限时、公平锁等特点。 /** @author Allen李 @date 说明ReentrantLock最初步的用法 */ public class TestReentrantLock01 implements Runnable { public static ReentrantLock lock = new ReentrantLock(); public static int i=0; @Override public void run() { for (int j = 0; j < 10000000; j++) { //并发规范写法一个加锁 lock.lock(); try { i++;

Does Java monitor include instance variables?

北慕城南 提交于 2019-12-29 03:10:41
问题 Is it that monitor in Java does not restrict access to instance variables and only to the methods which are declared synchronized or code in synchronized statements? I have created two threads, thread y invokes sync() method, which is declared synchronized while thread r invokes unsync() method which is not declared synchronized. Both invoke methods on shared object s . Thread r is able to modify the instance variable of object s while the monitor or lock of that object is still being held by

Java并发(2)- synchronized与CAS

非 Y 不嫁゛ 提交于 2019-12-28 15:06:07
文章目录 1.引言 2.synchronized 3.synchronized的三种使用方式 4.synchronized的底层原理 5.JDK1.6对synchronized的优化 6.synchronized的等待唤醒机制 7.CAS 原文转载:https://www.cnblogs.com/konck/p/9393135.html 1.引言 上一篇文章中我们说过,volatile通过lock指令保证了可见性、有序性以及“部分”原子性。但在大部分并发问题中,都需要保证操作的原子性,volatile并不具有该功能,这时就需要通过其他手段来达到线程安全的目的,在Java编程中,我们可以通过锁、synchronized关键字,以及CAS操作来达到线程安全的目的。 2.synchronized 在Java的并发编程中,保证线程同步最为程序员所熟悉的就是synchronized关键字,synchronized关键字最为方便的地方是他不需要显示的管理锁的释放,极大减少了编程出错的概率。 在Java1.5及以前的版本中,synchronized并不是同步最好的选择,由于并发时频繁的阻塞和唤醒线程,会浪费许多资源在线程状态的切换上,导致了synchronized的并发效率在某些情况下不如ReentrantLock。在Java1.6的版本中,对synchronized进行了许多优化

calling Thread.sleep() from synchronized context in Java

回眸只為那壹抹淺笑 提交于 2019-12-28 12:43:11
问题 I have read that Thread.sleep() will pause the currently running thread for the time specified after which it goes back to runnable state waiting for it's turn to run. Also, if called from synchronized context, sleep() doesn't release the lock it holds. So I was wondering when it will release the lock. If the thread, put on sleep, never gets the chance to run so it will always keep the lock with itself and then how other threads get to enter synchronized methods/block. I am not sure if I am

How to refer to Enclosing class from Inner class?

房东的猫 提交于 2019-12-28 06:50:13
问题 I am extending ArrayList to create a custom ArrayList that can be modified using normal ArrayList methods while iterating over it. For this I am also creating an Iterator. public class SynchronizedList<E> extends ArrayList<E> { // Fields here //Constructors and methods here public class SynchronizedListIterator<E> implements Iterator<E> { public int index; private E current; public boolean hasNext() { synchronized (/* reference to enclosing List object */) { //code goes here } return false; }

Java线程唤醒与阻塞

懵懂的女人 提交于 2019-12-28 05:31:00
阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一 定已经很熟悉了。Java 提供了大量方法来支持阻塞,下面让我们逐一分析。 转载于: http://blog.csdn.net/small____fish/article/details/7726468   1. sleep() 方法 :sleep() 允许 指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间 内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。   典型地,sleep() 被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后 重新测试,直到条件满足为止。   2. suspend() 和 resume() 方法 :两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会 自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个 线程产生了结果后,调用 resume() 使其恢复。   3. yield() 方法 :yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于 可执行状态,随时可能再次分得 CPU 时间。调用 yield()

线程的阻塞 sleep() wait() yield()

无人久伴 提交于 2019-12-28 05:30:44
为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了的资源也可能不止一个。为了解决这种情况下的访问控制问题,Java 引入了对阻塞机制的支持。 阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一定已经很熟悉了。Java 提供了大量方法来支持阻塞,下面让我们逐一分析。 1. sleep() 方法: 1) sleep() 允许 指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。 2) 当调用sleep ()函数后,线程不会释放它的“锁标志”。 典型地,sleep() 被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止。 2. suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用

java线程阻塞(sleep,suspend,resume,yield,wait,notify)

↘锁芯ラ 提交于 2019-12-28 05:30:27
为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了的资源也可能不止一个。为了解决这种情况下的访问控制问题,Java 引入了对阻塞机制的支持。 阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一定已经很熟悉了。Java 提供了大量方法来支持阻塞,下面让我们逐一分析。 1. sleep() 方法 :sleep() 允许 指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。典型地,sleep() 被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止。 2. suspend() 和 resume() 方法 :两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。 3. yield() 方法 :yield()