Java实现多线程同步

       当多个线程操作共享数据时,另一个线程不能同时操作该共享数据,否则结果将会出错。例如:银行在各账户间转移账目,个账户数据就是共享资源对象。为了确保某一时刻只有一个线程在操作共享数据,可使用关键字Synchronized为共享数据加锁,即只有一个线程能取到加锁对象的钥匙,对加锁对象进行操作,当该线程操作完毕后,其他线程才能操作该对象,从而实现对共享资源的保护。

     不带参数的wait()方法将一直保持等待,知道其他线程调用notify()方法将其唤醒。

public class SynchronizedBuffer{
 private int buffer = -1;//定义缓冲区
 private boolean occupied = false;//信号量,用于两线程同步
 
 public synchronized void set(int value) {//该方法设置Bufer的值模拟生产者生产
  //得到调用该方法当前线程的名字
  String name = Thread.currentThread().getName();
  while(occupied) {//occupied为True,表明已经生产但还么有消费
   try {
    System.err.println(name+"试图生产,但上一次生产还没有消费,等待消费!");
    wait();//生产者线程等待
   }
   catch(InterruptedException e) {
    e.printStackTrace();
   }
  }
  buffer = value;//消费者线程唤醒该线程后,可以生产
  System.out.println(name+" 生产一个整数: "+buffer);
  occupied = true;//表明已经生产,必须先消费才能生产
  notify();//唤醒消费者线程
 }
 
 public synchronized int get() {//该方法得到Buffer的值,模拟消费者
  String name = Thread.currentThread().getName();
  while(!occupied) {//occupied为false,表明还没有生产,不能消费
   try {
    System.err.println(name+" 试图消费,但还没有生产,等待生产!");
    wait();//消费者线程等待
   }
   catch(InterruptedException e) {
    e.printStackTrace();
   }
   
  }
  occupied = false;//表明已经消费可以生产
  System.out.println(name+" 消费一个整数:"+buffer);
  notify();//唤醒生产者
  return buffer;
 }
}

public class Producer extends Thread{
 private SynchronizedBuffer sharedBuffer;//生产者线程存放数据的空间
 public Producer(SynchronizedBuffer sharedBuffer) {
  super("生产者线程");
  this.sharedBuffer = sharedBuffer;
 }
 public void run() {//线程启动后执行,模拟生产5个数
  for(int count=1; count<6; count++) {
   try {
    Thread.sleep((int)(Math.random()*2000));//线程休眠
    sharedBuffer.set(count);//生产一个数
   }
   catch(InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
}

 

public class Consumer extends Thread{
 private SynchronizedBuffer sharedBuffer;//消费者线程消费数据空间
 public Consumer(SynchronizedBuffer sharedBuffer) {
  super("消费者线程");
  this.sharedBuffer = sharedBuffer;
 }
 public void run() {//线程启动后执行,模拟消费5个整数
  int sum = 0;
  for(int count=1; count<6; count++){
   try {
    Thread.sleep((int)(Math.random()*2000));//线程休眠
    sum += sharedBuffer.get();//消费一个数
   }
   catch(InterruptedException e) {
    e.printStackTrace();
   }
  }
  System.out.println(getName()+"消费者的整数和: "+sum);
 }
}

public class Test {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  System.out.println("模拟生产者和消费者同步");
  //生产者和消费者线程共享数据存储空间
  SynchronizedBuffer sharedBuffer = new SynchronizedBuffer();
  Producer producer = new Producer(sharedBuffer);//生产者线程
  Consumer consumer = new Consumer(sharedBuffer);//消费者线程
  producer.start();//启动生产者
  consumer.start();//启动消费者
 }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值