对象及变量的并发问题

一、synchronized对象监视器为Object时的使用


  1.1 synchronized方法

   1.当A线程调用anyObject对象加入synchronized关键字的x方法,A线程获得了X方法的锁,即获得了对象锁,所以其他线程等A线程执行完毕才可以调用X方法,但其他线程可以随意调用其他的非synchronized同步方法;

    2..当A线程调用anyObject对象加入synchronized关键字的x方法,其他线程调用该对象的非x方法的synchronized同步方法时,必须等A线程执行完一个完整的任务时才能执行;

   3.锁重入:自己可以再次获取自己的内部锁,如:一个线程获取到了某个对象的锁,此时对象锁还没释放,当再次想获取这个对象的锁时还时可以获取的,如果不可锁重入的话,就会造成死锁;

   4.出现异常,锁自动释放;

   5.同步不具有继承性;

   1.2synchronized(非this对象X)   

   1.synchronized(非this)代码块中的程序与同步方法时异步的,不予其他锁this同步方法争抢this锁,提升效率;

   2.对象监视器必须是同一个对象,否则运行异步;

   3.多个线程同时执行synchronized(X)同步代码时呈同步效果;

   4.当其他线程执行x对象中synchronized同步方法时呈现同步;

   5.当其他线程执行x对象中synchronized(this)同步块代码时呈现同步。

   1.3synchronized同步语句块

  1.synchronized方法某些情况下存在弊端:如A线程调用同步方法执行一个长时间的任务,那边么B线程需要等待比较长的时间,这个可以用synchronized同步语句块来解决;
    synchronized(this)

    1.与synchronized方法遵循规则一一致:

    1.1对其他synchronized方法或synchronized(this)同步代码块调用呈阻塞状态;

    1.2同一时间只有一个线程可以执行同步块中的代码。

二、synchronized对象监视器为CLASS时的使用
   2.1 静态同步synchronized方法
   2.2 synchronized(class)

        1.synchronized(string)同步快与string联合使用的注意事项,因常量池的存在会影响结果;

        2.死锁,因不同线程都在等待根本不可能释放的锁,从而导致所有的任务无法继续完成。

        3.多个线程同时持有锁对象,同步环是异步关键看是否锁的是同一对象;

        4.锁对象与锁类之间为异步;

        5.只要对象不变,即使对象的属性被改变,运行结果还时同步;

三、非线程安全如何出现

1.多个线程对同一对象中的实例变量进行并发访问时发生;

2.方法内部的私有变量不存在非线程安全问题,因为方法内部的变量是私有特性造成的;

3.多个线程调用多个对象是不会出现线程安全,因为JVM将每个对象创建一个锁。

4.线程安全包含原子性与可见性两个方面,java同步机制是围绕这两个方面确保线程安全的;

四、volatile关键字

1.主要作用使变量在线程之间可见,强制从公共堆栈中取得变量的值,而不是从线程私有数据栈取得变量的值;

2.volatile关键字致命的缺点是不支持原子性;

3.关键字volatile主要使用场合是在多个线程可以感知实例变量被该变了,并且可以获得最新的使用,也就是多线程读取共享变量时可以获取到最新值得使用;

五、volatile与synchronized的区别及使用情况

1.volatile是线程轻量级的实现,所以volatile性能比synchronized要好,并且volatile只能修饰变量,而synchronized可以修饰方法及代码块;

2.多线程volatile不发生阻塞,而synchronized发生阻塞;

3.volatile保证可见性,但是不保证原子性,而synchronized保证原子性,也间接保证可见性;

发布了20 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/heijunwei/article/details/104525285