多线程小知识2

来源:互联网 发布:mac os 10.13 iso下载 编辑:程序博客网 时间:2024/06/05 16:47

这里写的比较乱,也没有一个好的逻辑。内容也是想到哪写到哪,主要是因为最近看很多面试题还有书,把自己觉得是一下小知识点记下来。

大家就那么一看啊。。。。。。。。。。。。。


非线程安全存在于实例变量中,方法内部的私有变量不存在非线程安全

  关键字Synchronized取得的都是对象锁,而不是对一段代码或者方法的锁,哪个线程先执行带Synchronized的方法,哪个线程就持有该对象的锁。
  只有共享资源的读写才需要同步化,关键字Synchronize声明的方法一定是排队运行的。
  A线程调用Synchronized入方法,所以先获得对象锁,其他的线程必须等A线程执行完才能调用其Synchronized方法,但是其他线程可以调用其非Synchronized方法。
  
  Synchronized有锁重入的功能:一个线程得到一个对象锁后,再次请求该对象锁还是可以再次得到的,
  也就是说,在Synchronized方法中,还是可以调用本类的其他的Synchronized方法的。
  可重入的概念是:自己可以再次获得自己的锁
  同样,当存在继承关系时,子类是完全可以通过吧“可重入锁“调用父类的同步方法
  当一个线程执行的代码块出现异常时,其 所持有的锁会自动释放
  
  同步不具有继承性
  
 当一个线程访问一个对象的同步代码块时,其他线程对同一个代码块的访问将被阻止,这说明Synchronized使用的对象监视器只有一个
 
  注意:Synchronized关键字加到非static上,是给对象加锁,放到static上是给class类加锁。
  string具有缓存功能,所以要是一个string对象加锁之后,两次访问的其实会是一个,要是对象就可以
  
  volatile :作用是是变量在多个对象间可见
  强制从公共堆栈中取得变量的值,而不是从每个线程私有的数据栈中取。

  缺点是:不支持原子性


  Synchronized关键字和Volatile的比较:
  
  关键字volatile是线程同步的轻量级实现,所以volatile的性能要好。
  volatile只能用来修饰变量,Synchronize可以用来修饰方法和方法快。
  多线程访问volatile不会发生阻塞,而Synchronized会出现阻塞。
  
  volatile能保证数据可见性,但不能保证原子性
  Synchronized可以保证原子性,也可以间接保证可见性,
  
  多线程安全包含原子性和可见性
  
  使用原子类进行i++操作,AtomicInteger类就是原子类,
  
  原子类就是在没有锁的情况下,做到线程安全
  
0 0
原创粉丝点击