没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
专业 java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构
java 高级特性增强
内容安排:
1、掌握多线程
2、掌握并发包下的队列
3、了解 JMS
4、掌握 JVM 技术
5、掌握反射和动态代理
java 多线程增强
.1. java 多线程基本知识
.1.1. 进程介绍
不管是我们开发的应用程序,还是我们运行的其他的应用程序,都需要先把程序安装
在本地的硬盘上。然后找到这个程序的启动文件,启动程序的时候,其实是电脑把当前
的这个程序加载到内存中,在内存中需要给当前的程序分配一段独立的运行空间。这片
空间就专门负责当前这个程序的运行。
不同的应用程序运行的过程中都需要在内存中分配自己独立的运行空间,彼此之间不
会相互的影响。我们把每个独立应用程序在内存的独立空间称为当前应用程序运行的一
个进程。
进程:它是内存中的一段独立的空间,可以负责当前应用程序的运行。当前这个进程负
责调度当前程序中的所有运行细节。
.1.2. 线程介绍
启动的 聊天软件,需要和多个人进行聊天。这时多个人之间是不能相互影响,但
是它们都位于当前 这个软件运行时所分配的内存的独立空间中。
传智播客致力打造专业的 IT 实战培训课程——务实、创新、质量、专注、分享、责任
专业 java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构
在一个进程中,每个独立的功能都需要独立的去运行,这时又需要把当前这个进程划
分成多个运行区域,每个独立的小区域(小单元)称为一个线程。
线程:它是位于进程中,负责当前进程中的某个具备独立运行资格的空间。
进程是负责整个程序的运行,而线程是程序中具体的某个独立功能的运行。一个进程中
至少应该有一个线程。
.1.3. 多线程介绍
现在的操作系统基本都是多用户,多任务的操作系统。每个任务就是一个进程。而在
这个进程中就会有线程。
真正可以完成程序运行和功能的实现靠的是进程中的线程。
多线程:在一个进程中,我们同时开启多个线程,让多个线程同时去完成某些任务(功
能)。
比如后台服务系统,就可以用多个线程同时响应多个客户的请求
多线程的目的:提高程序的运行效率。
.1.4. 多线程运行的原理
在线程中做时间片的切换。
其实真正电脑中的程序的运行不是同时在运行的。 负责程序的运行,而 在运
行程序的过程中某个时刻点上,它其实只能运行一个程序。而不是多个程序。而 它
可以在多个程序之间进行高速的切换。而切换频率和速度太快,导致人的肉眼看不到。
每个程序就是进程,而每个进程中会有多个线程,而 是在这些线程之间进行切换。
了解了 对一个任务的执行过程,我们就必须知道,多线程可以提高程序的运行效率 ,
但不能无限制的开线程。
.1.5. 实现线程的两种方式
、继承 的方式
见代码
、声明实现Runnable接口的方式
见代码
传智播客致力打造专业的 IT 实战培训课程——务实、创新、质量、专注、分享、责任
专业 java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构
.2. java 同步关键词解释
.2.1. synchronized
加同步格式:
需要一个任意的对象(锁)!
代码块中放操作共享数据的代码。
"
见代码 #
的缺陷
是 $% 中的一个关键字,也就是说是 &% 语言内置的特性。
如果一个代码块被 修饰了,当一个线程获取了对应的锁,并执行该代码
块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁
只会有两种情况:
)获取锁的线程执行完了该代码块,然后线程释放对锁的占有;
)线程执行发生异常,此时 &' 会让线程自动释放锁。
例子 :
如果这个获取锁的线程由于要等待 ( 或者其他原因(比如调用 方法)被阻塞了,
但是又没有释放锁,其他线程便只能干巴巴地等待,试想一下,这多么影响程序执行效率。
因此就需要有一种机制可以不让等待的线程一直无期限地等待下去(比如只等待一定
的时间或者能够响应中断),通过 )* 就可以办到。
例子 :
当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生
冲突现象,但是读操作和读操作不会发生冲突现象。
但是采用 关键字来实现同步的话,就会导致一个问题:
如果多个线程都只是进行读操作,当一个线程在进行读操作时,其他线程只能等待无
法进行读操作。
因此就需要一种机制来使得多个线程都只是进行读操作时,线程之间不会发生冲突,
通过 )* 就可以办到。
另外,通过 )* 可以知道线程有没有成功获取到锁。这个是 无法办到的。
总的来说,也就是说 )* 提供了比 更多的功能。
2.2 lock
* 和 的区别
))* 不是 &% 语言内置的, 是 &% 语言的关键字,因此是内置特性。
)* 是一个类,通过这个类可以实现同步访问;
传智播客致力打造专业的 IT 实战培训课程——务实、创新、质量、专注、分享、责任
专业 java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构
))* 和 有一点非常大的不同,采用 不需要用户去手动释
放锁,当 方法或者 代码块执行完之后,系统会自动让线程释放对
锁的占用;而 )* 则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现
死锁现象。
$%+,++* 包下常用的类
)*
首先要说明的就是 )*,通过查看 )* 的源码可知,)* 是一个接口:
-.)*!
%*/
%*,-0,/
-)*/
-)*1,20,/
%*/
"
)* 接口中每个方法的使用:
*、)*、)*1,2、*,-是用来获取锁的。
)*方法是用来释放锁的。
四个获取锁方法的区别:
*方法是平常使用得最多的一个方法,就是用来获取锁。如果锁已被其他线程获取 ,
则进行等待。
由于在前面讲到如果采用 )*,必须主动去释放锁,并且在发生异常时,不会自动释
放锁。因此一般来说,使用 )* 必须在 !"!"块中进行,并且将释放锁的操作放在
3 块中进行,以保证锁一定被被释放,防止死锁的发生。
)*方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回 ,如
果获取失败(即锁已被其他线程获取),则返回 .,也就说这个方法无论如何都会立即
返回。在拿不到锁时不会一直在那等待。
)*1,2方法和 )*方法是类似的,只不过区别在于这个方
法在拿不到锁时会等待一定的时间,在时间期限之内如果还拿不到锁,就返回 .。如果
如果一开始拿到锁或者在等待期间内拿到了锁,则返回 。
*,-方法比较特殊,当通过这个方法去获取锁时,如果线程正在等待获取
锁,则这个线程能够响应中断,即中断线程的等待状态。也就是说,当两个线程同时通过
*+*,-想获取某个锁时,假若此时线程 4 获取到了锁,而线程 5 只有等待,
那么对线程 5 调用 5+方法能够中断线程 5 的等待过程。
注意,当一个线程获取了锁之后,是不会被 方法中断的。
因此当通过 *,-方法获取某个锁时,如果不能获取到,只有进行等待的情
传智播客致力打造专业的 IT 实战培训课程——务实、创新、质量、专注、分享、责任
专业 java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构
况下,是可以响应中断的。
而用 修饰的话,当一个线程处于等待某个锁的状态,是无法被中断的,
只有一直等待下去。
6)*
直接使用 * 接口的话,我们需要实现很多方法,不太方便,6)* 是唯一
实现了 )* 接口的类,并且 6)* 提供了更多的方法,6)*,意思
是“可重入锁”。
以下是 6)* 的使用案例:
例子 ,*的正确使用方法
见代码 )*
例子 ,)*的使用方法
见代码 )*
例子 7,*,-响应中断的使用方法:
见代码 ,-
6)*
6)* 也是一个接口,在它里面只定义了两个方法:
-.6)*!
899
96*.1+
9
9:*.1+
98
)*)*/
899
96*.0,1+
9
9:*.0,1+
98
)*0)*/
"
一个用来获取读锁,一个用来获取写锁。也就是说将文件的读写操作分开,分成 个
锁来分配给线程,从而使得多个线程可以同时进行读操作。下面的 66)*
实现了 6)* 接口。
66)*
66)* 里面提供了很多丰富的方法,不过最主要的有两个方法:
传智播客致力打造专业的 IT 实战培训课程——务实、创新、质量、专注、分享、责任
剩余30页未读,继续阅读
资源评论
shuyechao520
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功