美文网首页
java面试知识总结---并发知识

java面试知识总结---并发知识

作者: 爱编程的凯哥 | 来源:发表于2019-03-13 06:12 被阅读12次

目标

记识java并发,valatile和synchronized区别,lock和synchronized区别

1 .valatile和synchronized区别

前言

  1. JMM模型,
    并发过程中如何处理可见性、原子性、有序性问题

  2. 并发编程两个关键问题

    • 线程间如何通信:
      a> 共享内存----隐式通信
      b>消息传递----wait() notify() notifyall(),显式通信

    • 线程间如何同步
      在共享内存的并发模型中,显式通信通过锁实现:如synchronized
      在消息传递的兵法模型中,由于消息的发送必须在消息接收之前,所以同步时隐时的

  3. 定位内存可见性问题

    volatitle

volatitle的原理和特性
1. 对于声明了volatile的变量进行写操作时,JVM会向处理器发送一条lock的指令,会把缓存行内的数据写会主内存中
2. 在多处理情况下,保证多个处理器缓存一致性的特点,就会实现缓存一致性问题

  1. synchronized:可重入锁,实现互斥性、可见性

  2. volititle 比synchronized开销小,可以做到原子性、可见性,但无法做到复合操作的原子性(读取、写入等多个操作).

6.synchronized 原理,
1 .通过moniter监视对象,首先通过monitor.enter监听对象,进入SynchronizedQueue中,执行完后,通过moniter.exit退出监听


sync.jpg

代码演示

public class Test {
    private static Object object = new Object();

    public Test() {
    }

    public static void main(String[] args) {
        synchronized(object) {
            System.out.println("nihao");
        }
    }


//查看字节码
java -c Test.class


public class kai.test.nina.Test {
  public kai.test.nina.Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field object:Ljava/lang/Object;
       3: dup
       4: astore_1
//monitorenter 监听对象
       5: monitorenter
       6: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       9: ldc           #4                  // String nihao
      11: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      14: aload_1
//monitorenter 监听对象结束
      15: monitorexit
      16: goto          24
      19: astore_2
      20: aload_1
      21: monitorexit
      22: aload_2
      23: athrow
      24: return
    Exception table:
       from    to  target type
           6    16    19   any
          19    22    19   any

  static {};
    Code:
       0: new           #6                  // class java/lang/Object
       3: dup
       4: invokespecial #1                  // Method java/lang/Object."<init>":()V
       7: putstatic     #2                  // Field object:Ljava/lang/Object;
      10: return
}

2.synchronized区别和lock的区别

首先synchronized的缺陷:

  1. synchronized什么时候释放锁,只能被动释放

    • 代码块执行完
    • 抛出异常
  2. synchronized 无法区分读写锁

  3. synchronized时java的关键字

而lock区别

  1. lock时juc中提供的接口
  2. 可通过ReadWriteLock实现读写分别加锁
  3. lokc可以主动释放锁
  4. 可配合condition通知指定线程

常见锁概念

  1. 可重入锁
  2. 公平锁,基于时间先后排序获取锁顺序
  3. 读写锁

相关文章

网友评论

      本文标题:java面试知识总结---并发知识

      本文链接:https://www.haomeiwen.com/subject/dnsquqtx.html