java中的锁的机制---自己的理解

mac2022-06-30  34

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、如果两个线程之间有共享的数据对象,则要使用该数据对象的锁,比如我们常用的 生产者-消费者 模式等,这里不再赘述。

转载于:https://www.cnblogs.com/gyflyx/archive/2011/10/29/2228651.html

最新回复(0)