多线程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也是一组。他们的区别,前者相对操作简单,是自动上锁,自动解锁,后者是手动上锁解锁。

目录
相关文章
|
13天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
38 9
|
16天前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
31 3
|
21天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
44 4
|
1月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
19 1
|
1月前
|
Java
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅。它们用于线程间通信,使线程能够协作完成任务。通过这些方法,生产者和消费者线程可以高效地管理共享资源,确保程序的有序运行。正确使用这些方法需要遵循同步规则,避免虚假唤醒等问题。示例代码展示了如何在生产者-消费者模型中使用`wait()`和`notify()`。
28 1
|
1月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
48 1
C++ 多线程之初识多线程
|
1月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
20 3
|
1月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
19 2
|
1月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
30 2
|
1月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
34 1
下一篇
无影云桌面