synchronized(this)和synchronized(object)的理解

如果有一块代码(或方法)可能被多个线程同时访问,然后里面操作的数据修改操作可能因为不同线程的操作而不一致的时候,使用synchronized锁定这块代码,确保同时只有一个线程访问这个代码块。也就是说,关键字synchronized可以用在任何类的方法里面,即使该类没有实现Runnable接口或者继承Thread类。

使用this和object的区别:this是对当前类做控制, 即保证当前类是线程安全的, 而对于非线程安全的类在调用时, 为保证其线程安全性可以在调用时使用synchronized(object)确保被调用类的线程安全

理解this和object的区别, 可以借助普通对象池和线程池代码来理解

使用this和object的方式称为同步代码块,对于类中不提供同步方法时可以采用同步代码块

同步方法就是在方法前加关键字synchronized,然后被同步的方法一次只能有一个线程进入,其他线程等待

而同步代码块则是在方法内部使用大括号使得一个代码块得到同步。 同步块会有 一个对象


synchronized和lock的区别

1)Lock是个接口,而synchronized是java关键字,synchronized是内置语言实现

2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象的发生;而Lock在发生异常时,如果没有主动通过unlock()去释放锁,则很有可能造成死锁现象,因此使用Lock时需要在finally块中释放锁

3)Lock可以让等待锁的线程相应中断;而synchronized不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断

4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到

5)Lock可以提高多个线程读操作的效率

在性能上来说,如果资源竞争不激烈的话,两者的性能是差不多的;而当资源竞争非常激烈(即有大量线程同时竞争)时,Lock的性能要远远优于synchronized

 

posted @ 2017-08-14 16:31  車輪の唄  阅读(108)  评论(0)    收藏  举报  来源