java并发控制机制-编程开发技术

java并发控制机制-编程开发技术

ID:30777352

大小:161.39 KB

页数:15页

时间:2019-01-03

java并发控制机制-编程开发技术_第1页
java并发控制机制-编程开发技术_第2页
java并发控制机制-编程开发技术_第3页
java并发控制机制-编程开发技术_第4页
java并发控制机制-编程开发技术_第5页
资源描述:

《java并发控制机制-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java并发控制机制-编程开发技术Java并发控制机制原文出处:Frodo在一般性开发中,笔者经常看到很多同学在对待java并发开发模型中只会使用一些基础的方法。比如volatile,synchronizcdo像Lock和atomic这类高级并发包很多人并不经常使用。我想大部分原因都是来Z于对原理的不屈性导致的。在繁忙的开发工作中,乂有谁会很准确的把握和使用正确的并发模型呢?所以最近基于这个思想,木人打算把并发控制机制这部分整理成一篇文章。既是对自C掌握知识的一个冋忆,也是希望这篇讲到的类容能帮助到大部分开发者。并行程序开发不可避免地要涉及多线程、多任务的协作和数据共享等问题。在JDK屮

2、,捉供了多种途径实现多线程间的并发控制。比如常用的:内部锁、重入锁、读写锁和信号量。Java内存模型在JavaH1,每一个线程有一块工作内存区,其小存放着被所有线程共享的主内存中的变量的值的拷贝。当线程执行时,它在自己的工作内存中操作这些变量。为了存取一个共享的变量,一个线程通常先获取锁定并且清除它的工作内存区,这保证该共享变量从所有线程的共享内存区正确地装入到线程的工作内存区,当线程解锁时保证该工作内存区中变量的值协会到共享内存中。当一个线程使用某一个变量时,不论程序是否止确地使用线程同步操作,它获取的值一定是由它本身或者其他线程存储到变量屮的值。例如,如果两个线程把不同的值或者对彖引

3、用存储到同一个共享变量中,那么该变量的值要么是这个线程的,要么是那个线程的,共享变量的值不会是由两个线程的引用值组合而成。一个变量时Java程序可以存取的一个地址,它不仅包括基本类型变量、引用类型变量,而且还包括数组类型变量。保存在主内存区的变量可以被所有线程共享,但是一个线程存取另一个线程的参数或者局部变量时不可能的,所以开发人员不必担心局部变量的线程安全问题。至于内存模型中线程工作内存与主内存的交互请关注http://www.cnblogs.com/nexiyi/p/java_memorymodelandthread,html,这里就不再做过多介绍。--volatile变量-多线程间

4、可见由于每个线程都有口己的工作内存区,因此当一个线程改变门己的工作内存中的数据时,对其他线程来说,可能是不可见的。为此,可以使用volatile关键字破事所有线程军读写内存中的变量,从而使得volatile变量在多线程间可见。声明为volatile的变量可以做到如下保证:1、其他线程对变量的修改,可以及时反应在当前线程中;2、确保当前线程对volatile变量的修改,能及时写回到共享内存中,并被其他线程所见;3、使用volatile声明的变量,编译器会保证其有序性。同步关键字synchronized同步关键字synchronized是Java语言中最为常用的同步方法Z—。在JDK早期版本

5、屮,synchronized的性能并不是太好,值适合丁•锁竞争不是特别激烈的场合。在JDK6中,synchronized和非公平锁的差距已经缩小。更为重要的是,synchronized更为简洁明了,代码可读性和维护性比较好。锁定一个对象的方法:publicsynchronizedvoidmethod(){}当method()A法被调用时,调川线程首先必须获得当前对象所,若当前对象锁被其他线程持冇,这调用线程会等待,犯法结束后,对彖锁会被释放,以上方法等价于下面的写法:publicvoidmethod(){synchronizcd(this){//dosomething•••}}其次,使用

6、synchronized还可以构造同步块,与同步方法相比,同步块可以更为楮确控制同步代码范围。一个小的同步代码非常有离少锁的快进快出,从而使系统拥有更高的吞吐屋。publicvoidmethod(Objecto){//beforesynchronized(o){//dosomething・・・}//aftersynchronized也可以用于static函数:publicsynchronizedstaticvoidmethod(){}这个地方一定要注意,synchronized的锁是加在当前Class对象上,因此,所有对该方法的调用,都必须获得Class对彖的锁。虽然synchroniz

7、ed可以保证对象或者代码段的线程安全,但是仅使用synchronized还是不足以控制拥有复杂逻辑的线程交互。为了实现多线程间的交互,还需要使用Object对象的wait()和notify()方法。典型用法:synchronized(obj){while«?»{obj.wait();//收到通知后,继续执行。在使用waitO方法前,需要获得对象锁。在waitO方法执行吋,当前线程或释放obj的独占锁,供其他线程使用。当等待在obj上

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。