synchronized

Volatile关键字

耗尽温柔 提交于 2019-12-20 04:10:01
1.什么是Volatile ThreadLocal可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值。 ThreadLocal在Java中为了加快程序的运行效率,对一些变量的操作通常是在该线程的寄存器或是CPU缓存上进行的,之后才会同步到主存中,而加了volatile修饰符的变量则是直接读写主存。 ThreadLocalVolatile 保证了线程间共享变量的及时可见性,但不能保证原子性 2.JMM(Java内存模型) 要搞懂Volatile首先要了解一下Java内存模型 共享内存模型指的就是Java内存模型(简称JMM), JMM决定一个线程对共享变量的写入时,能对另一个线程可见 。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系: 线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本 。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。 从上图来看,线程A与线程B之间如要通信的话,必须要经历下面2个步骤: (1) 首先,线程A把本地内存A中更新过的共享变量刷新到主内存中去。 (2) 然后

Running wait() on a Thread instance from within main() in Java

大憨熊 提交于 2019-12-19 16:57:06
问题 I am playing around with the timed version of wait() in java.lang.Object and have observed that it acts differently in two different scenarios. Scenario1: Using the default definition of run() in Thread public static void main (String[] args) throws InterruptedException { Thread t = new Thread(); t.start(); System.out.print("X"); synchronized(t) { t.wait(10000);} System.out.print("Y"); } Questions on scenario1: I am experiencing a delay between X and Y. Is this because I am calling wait()

JUC(二)——深入理解锁机制

懵懂的女人 提交于 2019-12-19 12:59:23
对于锁大家肯定都不陌生,锁分为synchronize和lock 但是大家是否知道锁到底锁住的是什么呢? 接下来我们举几个例子来了解锁(这里使用synchronize来演示) 1、该代码先打印的是短信还是邮件? class Phone { public synchronized void sendSMS ( ) throws Exception { System . out . println ( "------短信" ) ; } public synchronized void sendEmail ( ) throws Exception { System . out . println ( "------邮件" ) ; } public void getHello ( ) { System . out . println ( "------hello" ) ; } } public class Lock { public static void main ( String [ ] args ) throws Exception { Phone phone = new Phone ( ) ; new Thread ( ( ) - > { try { phone . sendSMS ( ) ; } catch ( Exception e ) { e . printStackTrace

Java多线程总结

笑着哭i 提交于 2019-12-19 12:09:45
1.多线程开发又叫JUC开发(java.util.concurrent),至少5年以上才能涉及到,面试阿里常问 2.线程和进程有什么区别? 1)进程是资源(CUP,内存)分配的最小单位,线程是程序执行的最小单位。 2)一个程序至少有一个进程,一个进程至少有一个线程。 3.多线程的特点 三高:高并发,高可用,高性能。 4.线程核心概念 1)线程就是独立的执行路径。 2)在程序执行时,即使没有自己创建线程,后台也会存在多个线程,如GC线程,主线程。 3)main()称之为主线程,为系统的入口点,用于执行整个程序。 4)在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的。 5)对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制。 6)线程会带来额外的开销,如CUP调度时间,并发控制开销。 7)每个线程在自己的工作内存交互,加载和存储主内存控制不当会造成数据不一致。 5.Java中哪个方法必须在方法内部处理异常并且不能抛出? 多线程实现方法中,继承Thread的Run()方法是不能进行方法内部处理异常并且不能抛出的。 5.多线程的实现方式 1)继承Thread public class MyThread extends Thread{ @Override public void run() { for (int i

面试官:请说一下对象锁和类锁的区别

和自甴很熟 提交于 2019-12-19 10:51:12
有锁才有自由 生活中不存在绝对的自由,绝对的自由通常对应的无序和混沌,只有在道德、法律、伦理的约束下的相对自由,才能使人感受到自由。 而在多线程编程中,锁是至关重要的,锁就是道德,就是法律约束,没有锁的多线程环境将会是混乱的,所有线程都在争夺资源,最后的结果就是导致系统崩溃,而有了锁之后,多线程环境才能稳定高效的工作。 synchronized 关键字 synchronized 是我们所说的重量级锁,所说的重量级是相对于那些自旋锁(AQS)而言的,比如可重入锁ReentrantLock。很多人谈 synchronized 色变,说它性能差、太重,貌似言之凿凿。放在多年前确实如此,但是 Java 1.7、1.8 已经对 synchronized 做了很大优化,其性能和那些轻量级锁几乎没有差距。 所以,我们再程序中其实可以放心的使用它,即使没有用过,也肯定在一些源码里见过,比如 Netty 中就有很多地方用到了它。 下面开始进入今天的主题,类锁和实例锁。看名字就已经很明显了,类锁就是所在类上的锁,实例就是锁在类实例上的锁。 实例锁 类声明后,我们可以 new 出来很多的实例对象。这时候,每个实例在 JVM 中都有自己的引用地址和堆内存空间,这时候,我们就认为这些实例都是独立的个体,很显然,在实例上加的锁和其他的实例就没有关系,互不影响了。 通常我们使用实例锁的方式有下面三种: 1、

Thread dump blocked AND locked

。_饼干妹妹 提交于 2019-12-19 10:03:07
问题 This is similar to Java thread dump: BLOCKED thread without "waiting to lock ...". Basically, I am seeing a BLOCKED thread but it has the lock it is waiting for: "pool-1-thread-60" prio=10 tid=0x00007fbf10017000 nid=0x210 waiting for monitor entry [0x00007fbed64e3000] java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.log4j.Category.callAppenders(Category.java:204) - locked <0x0000000742444ad0> (a org.apache.log4j.Logger) at org.apache.log4j.Category.forcedLog(Category.java:391

Thread dump blocked AND locked

老子叫甜甜 提交于 2019-12-19 10:01:35
问题 This is similar to Java thread dump: BLOCKED thread without "waiting to lock ...". Basically, I am seeing a BLOCKED thread but it has the lock it is waiting for: "pool-1-thread-60" prio=10 tid=0x00007fbf10017000 nid=0x210 waiting for monitor entry [0x00007fbed64e3000] java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.log4j.Category.callAppenders(Category.java:204) - locked <0x0000000742444ad0> (a org.apache.log4j.Logger) at org.apache.log4j.Category.forcedLog(Category.java:391

Java: How to check if a lock can be acquired? [duplicate]

末鹿安然 提交于 2019-12-19 05:48:55
问题 This question already has answers here : How do determine if an object is locked (synchronized) so not to block in Java? (7 answers) Closed 2 years ago . If I want to ensure exclusive access to an object in Java, I can write something like this: ... Zoo zoo = findZoo(); synchronized(zoo) { zoo.feedAllTheAnimals(); ... } Is there a way to check if an object is currently locked? I don't want my thread to wait if another thread is accessing zoo . If zoo is not locked, I want my thread to acquire

Monitor机制

心已入冬 提交于 2019-12-19 05:31:19
Monitor机制 monitor概要 Java 语言实现 monitor 机制,属于编译器的工作。 monitor机制需要3个元素配合使用,分别是: 临界区 monitor 对象及锁 条件变量以及定义在 monitor 对象上的 wait,signal 操作 使用monitor机制让互斥进入临界区,用monitor 对象来保存被阻塞的线程,由于 monitor 机制本质上是基于 mutex 这种基本原语的,所以 monitor object 还必须维护一个基于 mutex 的锁。而条件变量的引入是为了能够在适当的时候阻塞和唤醒 进程/线程,由这个条件变量来确定什么时候是“适当的时候”。条件变量的定义有很大的自主性 monitor实现 monitor是操作系统提出的一种高级原语。monitor在java的具体实现是依靠synchronized 关键字来修饰实例方法、类方法以及代码块,被 synchronized 关键字修饰的方法、代码块,就是 monitor 机制的临界区。 synchronized关联的对象就是 monitor object。monitor object 充当着维护 mutex以及定义 wait/signal API 来管理线程的阻塞和唤醒的角色。 java.lang.Object 类定义了 wait(),notify(),notifyAll() 方法

Execution of new thread inside a synchronized block

为君一笑 提交于 2019-12-19 05:18:59
问题 If i create a new thread inside a synchronized block, will the block remain locked till the thread execution is also complete? If not, then till when would it remain locked? String sLine; onClick(String line){ synchronized (lock) { sLine = line; new Thread(new Runnable() { @Override public void run() { doProcessing(Sline); }).start(); } } 回答1: It would only remained locked if the code join()d with the newly created thread, thus waiting for it to finish. As there is no join() the lock will be