Java 线程同步问题也不是什么新鲜问题了,这里做一个总结吧。
线程同步时,调用一个 synchronized 的方法,所有的 synchronized 的方法都被锁定,其他的方法不受影响。
看一个例子:
package com.ldq;
public class Test06 {
private static Obj o1;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
o1 = new Obj();
new Thread() {
public void run() {
o1.method01();
}
}.start();
new Thread() {
public void run() {
o1.method02();
}
}.start();
new Thread() {
public void run() {
o1.method03();
}
}.start();
}
}
class Obj {
synchronized void method01() {
while (true) {
System.out.println("method01");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
void method02() {
while (true) {
System.out.println("method02");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
synchronized void method03() {
while (true) {
System.out.println("method03");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
以上代码输出结果为:
method01
method02
method02
method02
method02
method02
method01
method02
method02
method02
分析:首先生成一个对象 o1 ,它有 3 个方法,其中 method01 和 method03 有关键字 synchronized 修饰,说明这两个方法要做线程同步,而 method02 没有关键字 synchronized 修饰,说明不用做同步。可见,对象加锁操作是针对有 synchronized 关键字而言的。调用 synchronized 的方法,整个对象的所有 synchronized 的方法都被加锁,但是其他的方法不受影响。
sleep() 和 wait() 的区别
sleep() 是 Thread 类的方法,wait() 是 Object 类的方法,由于所有类都是 Object 的子类,因此所有类都有 wait() 方法,从源代码看 public final native void wait() ,wait() 方法是 final ,不允许重载或是覆盖的,并且是 native ,是由本机接口实现的,与 JVM 的相关。
sleep() 就是让线程空转,但是仍然占用资源。wait() 用在 synchronized 修饰的方法里,让线程暂停,并释放资源,直到有别的线程调用 notify() 或者 notifyAll() 方法唤醒。
对某一个对象,wait() 让线程进入等待池,notify() 唤醒一个线程,notifyAll() 唤醒所有的线程。
看代码吧:
package com.ldq;
public class Test07 {
private static MyObj o1;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
o1 = new MyObj();
new Thread() {
public void run() {
o1.method01();
}
}.start();
new Thread() {
public void run() {
o1.method02();
}
}.start();
}
}
class MyObj {
synchronized void method01() {
while (true) {
System.out.println("method01");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
notify();
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
synchronized void method02() {
while (true) {
System.out.println("method02");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
notify();
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
输出为:
method01
method02
method01
method02
method01
method02
...
分析:匿名线程1执行完method01后,notify() 等待的线程,wait() 释放锁,匿名线程2获得锁后输出,notify() 等待的匿名线程1,自己 wait() 释放锁,此时,匿名线程1就可以继续执行,如此循环 ...
分享到:
相关推荐
java线程同步java线程同步java线程同步
多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!
java多线程同步互斥访问实例,对于初学者或是温故而知新的同道中人都是一个很好的学习资料
Java多线程同步论文.doc
java 多线程同步方法的实例 java 多线程同步方法的实例 java 多线程同步方法的实例
java多线程同步分析java多线程同步分java多线程同步分析析java多线程同步分析java多线程同步分析
本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能
Java多线程同步.pdf
Java多线程同步问题分析
Java多线程同步具体实例.doc
Java线程(二):线程同步synchronized和volatile 详细讲解Java 同步的原理技术资料
Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 ...
Java多线程同步具体实例讲解 .doc
Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的...
java线程同步实例,哲学家思考的代码实现,应该是一个比较好的例子
Java多线程同步问题的探究.pdf
Java线程:概念与原理 2 ...五、 关于同步和锁定的一些问题 41 Java线程:并发协作-线程的交互 47 Java线程:并发协作-生产者消费者模型 52 Java线程:并发协作-死锁 55 Java线程:线程之间的数据传递 58
JAVA代码采用线程来实现数据库的主从同步更新
一个详细讲解JAVA_线程同步与死锁的例子 希望可以帮助到你。