java基础synchronized和lock类

java基础synchronized和lock类

1.背景介绍

多线程,是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。多线程一般继承Thread或者实现Runnable,jdk1.5使用ExecutorService、Callable、Future实现有返回结果的多线程

线程安全:线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

2.知识剖析

线程如何安全:类要成为线程安全的,首先必须在单线程环境中有正确的行为。一个类要成为线程安全的,在被多个线程访问时,不管运行时环境执行这些线程有什么样的时序安排或者交错,它必须仍然有如上所述的正确行为,并且在调用的代码中没有任何额外的同步。

 

多线不安全原因: 线程安全问题都是由全局变量及静态变量引起的。

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

synchronized

synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程,运行到这个方法时,都要检查有没有其它线程 正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程运行完这个方法后再运行此线程,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

synchronized的缺点

线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定,如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断。

lock类

                lock中的一些方法,Lock lock = new ReentrantLock(); lock.newCondition();tryLock();join();awark();

                signal();lock.unlock().

            使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情

5.0的多线程任务包对于同步的性能方面有了很大的改进,在原有synchronized关键字的基础上,又增加了ReentrantLock,以及各种Atomic类。jdk1.6出现偏向锁public static ListnumberList = new Vector();轻量级锁BasicObjectLock;重量级锁;自旋锁。

synchronized:

在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合适的

ReentrantLock提供了多样化的同步,在资源竞争不激烈的情形下,性能稍微比synchronized差点点。但是当同步非常激烈的时候,synchronized的性能一下子能下降好几十倍。而ReentrantLock确还能维持常态。

        Atomic:不激烈情况下,性能比synchronized略逊,激烈的时候,Atomic的性能会优于ReentrantLock一倍左右。但是其有一个缺点,就是只能同步一个值,一段代码中只能出现一个Atomic的变量,多于一个同步无效。因为他不能在多个Atomic之间同步。   

  我们写同步的时候,优先考虑synchronized,如果有特殊需要,再进一步优化。ReentrantLock和Atomic如果用的不好,不仅不能提高性能,还可能带来灾难。

3.常见问题

死锁。

4.解决方案

查出死锁出现的原因规则 1:多线程、进程并行访问共享资源时,一定要加锁保护。 规则2:锁的职责单一。 规则3:锁范围尽量小,只锁对应资源操作代码。 规则4:避免免嵌套加锁;如果必须加锁,务必保证不同地方的加锁顺序是一样的。

建议1:进程间通讯,使用自己保证互斥的数据库系统、共享内存,或socket消息机制;尽量避免使 用文件等进程无法管理的资源。 建议2:可重入函数尽量只使用局部变量和函数参数,少用全局变量、静态变量。 建议3: 锁中避免调用函数;如果必须调用函数,务必保证不会造成死锁 建议4 锁中避免使用跳转语句

 

5.编码实战

6.扩展思考

7.参考文献

百度,优快云博客

8.更多讨论

提问

q:引起线程不安全的原因?

a:多线程中计算机在操作公共数据时候,每个核其实只进行但计算,公共变量在多线程中更改会相互影响,线程的争夺执行权会对公共数据的改变调用,而造成脏数据。

q:怎么优化synchronize?

a:单例模式的synchronize使用懒汉式时候使用双重否定方式,synchronize同步代码块尽量少的代码,尽量不适用嵌套锁。一定使用要确定锁的职责单一,使用顺序一致。

q:lock的优势?

a:lick类封装很多方法,使用更加灵活,方式更多。而却线程多的时候,效率比synchronize高出很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值