---摘自高人
因为多线程,所以我们需要对线程进行一些调度,也就是对线程进行一些处理,防止多线程带来的不同步问题。
在Java中,大的说有两种机制去实现多线程的同步,但是本质上来讲,是一种机制,那就是锁。
首先,是Java中的 java.util.concurrent.locks 中的锁。
这个包中有一个接口 Lock, 有一个类 ReentrantLock 实现了 Lock。
该方法中有一个lock方法,也就是获取锁,一旦某一个线程执行到这个方法,该线程就获得了锁。
如果别的线程如果执行到该方法,而锁已经被另一个线程获取了,则该线程被阻塞,直到获得锁的线程执行到 unlock 方法。
也就是说,如果获得锁的线程没有知道 unlock 方法,则别的线程永远不能运行 lock 和 unlock 之间的代码。
为了保证unlock方法用于被执行,一般都采用如下的格式开发:
Java代码
1.Lock l= new ReentrantLock();
2.
3.l.lock();
4.
5.try{
6. //需同步的代码
7.}
8.finally{
9. l.unlock();
10.}
Lock l= new ReentrantLock();
l.lock();
try{
//需同步的代码
}
finally{
l.unlock();
} 这样,就保证了线程的同步。
还有这样一种情况,当同步的代码需要某个条件时,线程才能继续执行。
那就很有可能某一线程获得锁,但是没有条件满足该线程继续运行,那么该线程就白白的浪费了这把锁。
所以,就有一个条件对象来解决这一问题。看下面的代码
Java代码
1.Lock l= new ReentrantLock();
2.Condition cd = l.newCondition(); //生成该锁的条件对象
3.
4.l.lock();
5.
6.try{
7. while( 条件不满足 )
8. cd.await(); // 使得线程释放该锁,并进入该锁的等待池
9.
10. //需同步的代码
11.
12. cd.signalAll(); //唤醒该锁等待池中的所有线程
13.}
14.finally{
15. l.unlock();
16.}
Lock l= new ReentrantLock();
Condition cd = l.newCondition(); //生成该锁的条件对象
l.lock();
try{
while( 条件不满足 )
cd.await(); // 使得线程释放该锁,并进入该锁的等待池
//需同步的代码
cd.signalAll(); //唤醒该锁等待池中的所有线程
}
finally{
l.unlock();
}这样,就实现了对线程的细节控制,使得我们可以精准的控制同步。
除了这个方法,Java中还有另外一种方法,也就是 synchronized 语法。本质上和上面所讲的lock是一样的。
下面同样看一段代码:
Java代码
1.synchronized ( obj ) {
2. //需同步的代码
3.}
synchronized ( obj ) {
//需同步的代码
}
虽然代码简单,但是和第一段代码的效果是一样的。
为了实现条件对象类似的效果,可以使用Object中的wait 和 notify 方法,如下代码:
Java代码
1.synchronized ( obj ){
2. while( 条件不满足 )
3. wait();
4.
5. //需同步的代码
6.
7. notifyAll();
8.}
synchronized ( obj ){
while( 条件不满足 )
wait();
//需同步的代码
notifyAll();
}
效果也同第二段代码一样,所以才说,这两种方法本质上是同一种方法。
分享到:
相关推荐
Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...
详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...
二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java线程:线程栈模型与线程的变量 12 Java线程:线程的调度-休眠 ...
一、实验目的 掌握多线程程序设计 二、实验环境 1、微型计算机一台 2、WINDOWS操作系统,Java SDK,Eclipse开发环境 三、实验内容 ...3、采用线程同步方法机制来解决多线程共享冲突问题,编写示例程序。
Java多线程--同步机制解决线程安全问题方式二:同步方法
Java线程(二):线程同步synchronized和volatile 详细讲解Java 同步的原理技术资料
Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...
java+多线程+同步详解源代码学习
java多线程同步互斥访问实例,对于初学者或是温故而知新的同道中人都是一个很好的学习资料
多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!
Java多线程同步论文.doc
java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例
Java多线程同步具体实例讲解 .doc
Java多线程同步.pdf
Java分布式应用学习笔记05多线程下的并发同步器
java多线程同步分析java多线程同步分java多线程同步分析析java多线程同步分析java多线程同步分析
java 多线程同步方法的实例 java 多线程同步方法的实例 java 多线程同步方法的实例
Java多线程核心技术:理解多线程、在Java中实现多线程、线程的生命周期、线程的优先级、线程的同步、线程的阻塞、守护线程、线程组、线程池、总结。