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

本文通过Java多线程技术展示如何利用对象的等待池和锁池实现线程间的通信,包括唤醒机制、通知机制及共享数据对象的应用。以两个线程A和B为例,A线程模拟休眠,B线程则通过每秒输入信息来唤醒A线程,展示线程间通过共享对象进行交互的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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
     */
    publicstatic void main(String[] args) {
        // TODO Auto-generated method stub
        Object object =newObject();
        A1 a1=newA1(object);
        B1 b1=newB1(object);
        Thread.yield();
  
    }
  
}
  
  
  
  
  
  
/////////////////这里令A只休息1分钟
class A1 extends Thread{
    privatestatic int a=0;//记录以及休息的毫秒数
    privateObject jObject;
    publicA1(Object jObject){
        this.jObject=jObject;
        this.start();
    }
    publicstatic  int getA(){
        returna;
    }
      
    publicvoid run(){
        synchronized(jObject){
            //notifyAll();
            Date date1=newDate();//获得睡觉时的时间
            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=newDate();
                a=(int)(date2.getTime()-date1.getTime());
            }
            System.out.println("A: 我睡醒了");
        }
          
    }
}
  
class B1 extends Thread{
      
    privateObject jObject;
    publicB1(Object jObject){
        this.jObject=jObject;
          
        //a.setPriority(MAX_PRIORITY);//将A线程设置最高权限,使该线程先启动
        //a.start();
        this.start();
    }
    publicvoid run(){
        //yield();//显示a获得cpu,使其先睡觉
        synchronized(jObject){
            inti=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、如果两个线程之间有共享的数据对象,则要使用该数据对象的锁,比如我们常用的 生产者-消费者 模式等,这里不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值