java中的锁的机制---自己的理解
java中的锁的机制
1、java中对象的锁应用的根本是:通过该对象的等待池(wait pool)和锁池(locked pool),来是若干个线程来通信
如果来个线程之间没有共享数据对象,但两个线程之间有逻辑关系,那么我们可以随意自定义一个对象(比如object),
使两个对象来操作该对象的锁,在各自的同步代码块中,通过调用该对象的wait()、notify()、notifyAll()等方法
来彼此之间通信。因为这几个线程
都共享该对象的等待池(wait pool)和锁池(locked pool)
例:
采用Java多线程技术编写程序,其中包括两个线程:A和B,其中A线程准备休眠一小时,B线程每隔一秒输入3句“起床”后,吵醒休眠的线程A
示例程序:
package com.gyf; import java.util.Date; public class T2 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Object object =new Object(); A1 a1=new A1(object); B1 b1=new B1(object); Thread.yield(); } } /////////////////这里领A只休息1秒钟 class A1 extends Thread{ private static int a=0;//记录以及休息的毫秒数 private Object jObject; public A1(Object jObject){ this.jObject=jObject; this.start(); } public static int getA(){ return a; } public void run(){ synchronized(jObject){ //notifyAll(); Date date1=new Date();//获得睡觉时的时间 Date date2; while(a<10000){ jObject.notifyAll(); System.out.println("A:我要开始睡觉了....."); try { jObject.wait(10000-a); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("A: 我被吵醒了....."); date2=new Date(); a=(int)(date2.getTime()-date1.getTime()); } System.out.println("A: 我睡醒了"); } } } class B1 extends Thread{ private Object jObject; public B1(Object jObject){ 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 (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
2、如果两个线程之间有共享的数据对象,则要使用该数据对象的锁,比如我们常用的 生产者-消费者 模式等,这里不再赘述。