学习JAVA多线程编程 --- 《JAVA多线程编程核心技术》第2章 对象及变量的并发访问 笔记

synchronized锁重入功能:

在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时可以再次得到。这也证明在一个synchronized方法/代码块的内部调用本类的其他synchronized方法/代码块时,是永远可以得到锁的。当父类和子类都存在synchronized的方法时,子类是完全可以通过“重入锁”调用父类的同步方法。

synrochnized异常:

当一个线程执行的代码出现异常时,其所持的锁会自动释放。也就是说在synchronized任务中,异常出现时,线程会从当前执行的任务中跳出,并自动释放锁。

父类与子类的synchronized:

synchronized的方法时不能继承同步的,所有通过继承(super.method)得到的父程序默认为不同步。子程序中如果需要同步要添加关键字synchronized。子程序可以调用父程序中的同步方法,可以通过重入锁直接获得锁,但是不能够继承。

锁this对象 vs. 锁非this对象:

锁非this对象具有一定的优点:如果在一个类中有很多歌synchronized方法,这时虽然能实现同步,但会受到阻塞,所有影响运行效率;但如果使用同步代码块锁非this对象,则synchronized(非this)代码块中的程序与同步方法是异步的,不与其他锁this同步方法争抢this锁,可以大大提高运行效率。

synchronized(非this对象x)格式的写法是将x对象本身作为“对象监视器”,这样就可以得出一下3个结论:1)当多个线程同时执行synchronized(x){}同步代码块时呈同步效果;2)当其他线程执行x对象中synchronized同步方法时呈同步效果;3)当其他线程执行x对象方法里面的synchronized(this)代码块时也呈同步效果。

synchronized静态方法:

关键字synchronized还可以应用在static静态方法上,如果这样写,那是对当前的*.java文件对于Class类进行持锁。而synchronized关键字加到非static静态方法是给对象上锁。Class的静态类锁和非静态方法锁是不同的锁,所有当Class有静态方法和非静态方法是,他们拥有的不是同一把锁。一个Class中的所有静态方法拥有同一把锁。

同步synchronized(xxx.class)代码块的作用其实和xxx class中synchronized static方法的作用一样。

监测死锁现象:

可以使用JDK自带的工具来监测是否有死锁的现象。首先进入CMD工具,在进入JDK的安装文件夹的bin目录,执行jps命令,看看是否有对于方法的使用线程存在。再执行jstack -l (使用线程ID)命令,查看结果。

同步对象:

当同步锁为对象时,改变对象的属性是不影响同步锁的同步效果的。当同步锁为数值时(比如String),改变数值前,所有的线程都使用同一数值锁,改变数值期间会出现有些线程还在用老数值的锁,有些线程已经用新数值的锁,这样会导致异步效果。

关键字volatile用途:

在多线程的应用中,通过变量来当循环条件时,变量本身将存储于公共堆栈(内存)以及其线程的私有堆栈(内存)中。为了提高线程运行的效率,线程一直访问私有堆栈的数值。如果这个值被其他线程改变,这个改变却是作用于公共堆栈中的变量。这样就造成线程私有堆栈中和公共堆栈中的变量值不同。解决这样的问题要使用volatile,主要作用就是当线程访问这个变量时,强制性从公共堆栈中取值。关键字volatile主要使用的场合是在多个线程中可以感知实例变量被更改了,并且可以获得最新的值使用,也就是用多线程读取共享变量时可以获得最新值使用。

关键字volatile和synchronized的比较:

volatile作用于变量,是解决变量在多个线程之间的可见性。synchronized作用于方法和代码块,是解决多个线程之间访问资源的同步性。多线程访问volatile不会发生阻塞,synchronized会出现阻塞。volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公共内存中的数据做同步。

关键字AtomicXXX:

Atomic作用下的变量都会具有原子性,但是在具有逻辑性使用的方法中(比如说至于run的方法中),Atomic作用下的变量方法是具有原子性,但是方法和方法之间(比如说两个addAndGet方法)不具有原子性,这种情况下也必须使用关键字synchronized来同步。

synchronized总述:

关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法或某一个代码块。它包含两个特性:互斥性和可见性。同步synchronized不仅可以解决一个线程看到对象处于不一致的状态,还可以保证进入同步方法或是同步代码块的每个线程,都看到由同一个锁保护之前所有的修改结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值