java中的锁的机制---自己的理解
2011-10-29 16:21
295 查看
java中的锁的机制
1、java中对象的锁应用的根本是:通过该对象的等待池(waitpool)和锁池(lockedpool),来是若干个线程来通信
如果来个线程之间没有共享数据对象,但两个线程之间有逻辑关系,那么我们可以随意自定义一个对象(比如object),
使两个对象来操作该对象的锁,在各自的同步代码块中,通过调用该对象的wait()、notify()、notifyAll()等方法
来彼此之间通信。因为这几个线程
都共享该对象的等待池(waitpool)和锁池(lockedpool)
例:
采用Java多线程技术编写程序,其中包括两个线程:A和B,其中A线程准备休眠一小时,B线程每隔一秒输入3句“起床”后,吵醒休眠的线程A
示例程序:
viewsourceprint?
2、如果两个线程之间有共享的数据对象,则要使用该数据对象的锁,比如我们常用的生产者-消费者模式等,这里不再赘述。
1、java中对象的锁应用的根本是:通过该对象的等待池(waitpool)和锁池(lockedpool),来是若干个线程来通信
如果来个线程之间没有共享数据对象,但两个线程之间有逻辑关系,那么我们可以随意自定义一个对象(比如object),
使两个对象来操作该对象的锁,在各自的同步代码块中,通过调用该对象的wait()、notify()、notifyAll()等方法
来彼此之间通信。因为这几个线程
都共享该对象的等待池(waitpool)和锁池(lockedpool)
例:
采用Java多线程技术编写程序,其中包括两个线程:A和B,其中A线程准备休眠一小时,B线程每隔一秒输入3句“起床”后,吵醒休眠的线程A
示例程序:
package com.gyf; |
import
|
public class T2{ |
/** |
*@paramargs |
*/ |
public static void main(String[]args){ |
//TODOAuto-generatedmethodstub |
Objectobject= new Object(); |
A1a1= new A1(object); |
B1b1= new B1(object); |
Thread.yield(); |
} |
} |
/////////////////这里令A只休息1分钟 |
class
extends Thread{ |
private static int a= 0 ; //记录以及休息的毫秒数 |
private ObjectjObject; |
public A1(ObjectjObject){ |
this .jObject=jObject; |
this .start(); |
} |
public static int getA(){ |
return a; |
} |
public void run(){ |
synchronized (jObject){ |
//notifyAll(); |
Datedate1= new Date(); //获得睡觉时的时间 |
Datedate2; |
while (a< 10000 ){ |
jObject.notifyAll(); |
System.out.println( "A:我要开始睡觉了....." ); |
try { |
jObject.wait( 10000 -a); |
} catch (InterruptedExceptione){ |
//TODOAuto-generatedcatchblock |
e.printStackTrace(); |
} |
System.out.println( "A:我被吵醒了....." ); |
date2= new Date(); |
a=( int )(date2.getTime()-date1.getTime()); |
} |
System.out.println( "A:我睡醒了" ); |
} |
} |
} |
class
extends Thread{ |
private ObjectjObject; |
public B1(ObjectjObject){ |
this .jObject=jObject; |
//a.setPriority(MAX_PRIORITY);//将A线程设置最高权限,使该线程先启动 |
//a.start(); |
this .start(); |
} |
public void run(){ |
//yield();//显示a获得cpu,使其先睡觉 |
synchronized (jObject){ |
int i= 0 ; //记录叫了几次(执行了几秒) |
while (A1.getA()< 10000 ){ |
jObject.notifyAll(); |
i++; |
try { |
sleep( 1000 ); |
System.out.println(i+ "B:起床起床起床" ); |
jObject.wait(); |
} catch (InterruptedExceptione){ |
//TODOAuto-generatedcatchblock |
e.printStackTrace(); |
} |
} |
} |
} |
} |
相关文章推荐
- Java序列化机制和原理及自己的理解
- java中的回调机制(自己的一点理解)
- java中的锁的机制---自己的理解
- 深入理解 Java 垃圾回收机制
- 深入理解Java的方法重载机制
- 深入理解JAVA I/O机制
- Android接口回调机制(有图有真相,如果你一直接触接口回调,但是自己又一直理解不了,这篇文章会让你秒懂)
- 深入理解Java并发机制(4)--AQS、ReentrantLock、ReentrantReadWriteLock源码分析
- 理解Java的static import静态引入机制
- 彻底理解java回调机制
- 深入理解Java Proxy机制
- 全面理解java异常机制
- 一个经典例子让你彻彻底底理解java回调机制
- 深入理解Java:类加载机制及反射
- 深入理解Java:类加载机制及反射
- 深入理解java异常处理机制
- 一个经典例子让你彻彻底底理解java回调机制
- 深入理解 Java 垃圾回收机制
- 一个经典例子让你彻彻底底理解java回调机制
- 深入理解 Java 垃圾回收机制