多线程wait,notify,synchronzied以及lock ,await,signal的用法

简介:   今天翻开以前的笔记练了下基本多的多线程。synchronzied,notify,wait的用法,主要用flg下标去控制waitpackage classForm;public class ThreadDemo4 { public s...

  今天翻开以前的笔记练了下基本多的多线程。synchronzied,notify,wait的用法,主要用flg下标去控制wait


package classForm;


public class ThreadDemo4 {
 public static void main(String[] args) {
  Res1 res1 = new Res1();
  InpThread inpThread = new InpThread(res1);
  inpThread.start();
  OutThread outThread = new OutThread(res1);
  outThread.start();
 }
}

class Res1{
 public String name;
 public String sex;
 public boolean flg=false;//flag为false戏按成未读取值xian
}

//写入线程
class InpThread extends Thread{
 public Res1 res1;
 public InpThread(Res1 res1){
  this.res1 = res1;
 }
 @Override
 public void run() {
  int count = 0;
  while(true){
   synchronized (res1) {
     if(res1.flg){
      try {
       res1.wait();
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
     }
     if(count == 0){
      res1.name="小明";
      res1.sex="男";
     }else{
      res1.name="小红";
      res1.sex="女";
     }
     count=(count+1)%2;
     //和wait一起使用,唤醒另外一个线程
     res1.flg=true;
     res1.notify();
    }
     
  }
 }
}
//读的线程
class OutThread extends Thread{
 public Res1 res1;
 public OutThread(Res1 res1){
  this.res1 = res1;
 }
 @Override
 public void run() {
  while(true){
   synchronized (res1) {
     if(!res1.flg){
      try {
       res1.wait();
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
     }
     //等待用flg去控制,其他代码块不能写到flg里面
     System.out.println(res1.name+"---"+res1.sex);
     res1.flg=false;
     res1.notify();
    }
  }
 }
}


其实synchronized和lock锁是比较类似的,下面请看lock锁的案例

package classForm;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadDemo05 {
 public static void main(String[] args) {
  Res2 res2 = new Res2();
  InpThread01 inpThread = new InpThread01(res2);
  inpThread.start();
  OutThread01 outThread = new OutThread01(res2);
  outThread.start();
 }
}

class Res2 {
 public String name;
 public String sex;
 public boolean flg = false;// flag为false戏按成未读取值xian
 public Lock lock = new ReentrantLock();// 使用lock锁
 Condition condition = lock.newCondition();//
}

// 写入线程
class InpThread01 extends Thread {
 public Res2 res2;

 public InpThread01(Res2 res2) {
  this.res2 = res2;
 }

 @Override
 public void run() {
  int count = 0;
  while (true) {
   res2.lock.lock();//上锁
   if (res2.flg) {
    try {
     res2.condition.await();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
   if (count == 0) {
    res2.name = "小明";
    res2.sex = "男";
   } else {
    res2.name = "小红";
    res2.sex = "女";
   }
   count = (count + 1) % 2;
   // 和wait一起使用,唤醒另外一个线程
   res2.flg = true;
   res2.condition.signal();
   res2.lock.unlock();//解锁
  }

 }
}

// 读的线程
class OutThread01 extends Thread {
 public Res2 res2;

 public OutThread01(Res2 res2) {
  this.res2 = res2;
 }

 @Override
 public void run() {
  while (true) {
   res2.lock.lock();
    if (!res2.flg) {
     try {
      res2.condition.await();//相当于wait
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
    // 等待用flg去控制,其他代码块不能写到flg里面
    System.out.println(res2.name + "---" + res2.sex);
    res2.flg = false;
    res2.condition.signal();//类似notify
    res2.lock.unlock();//解锁
   }
 }
}


综上所述,wait,notify,synchronzied要一起使用,并且上锁必须要同一对象,lock ,await,signal也是一组。他们的区别,前者相对操作简单,是自动上锁,自动解锁,后者是手动上锁解锁。

目录
相关文章
|
12月前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
220 9
|
12月前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
119 3
|
11月前
|
Java 调度
|
12月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
142 4
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
162 1
|
Java
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅。它们用于线程间通信,使线程能够协作完成任务。通过这些方法,生产者和消费者线程可以高效地管理共享资源,确保程序的有序运行。正确使用这些方法需要遵循同步规则,避免虚假唤醒等问题。示例代码展示了如何在生产者-消费者模型中使用`wait()`和`notify()`。
110 1
|
20天前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
105 6
|
4月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
279 83
|
8天前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
79 0
|
2月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
151 16

热门文章

最新文章

下一篇
开通oss服务