wait/notify 实现多线程交叉备份
一、任务
创建20个线程,其中10个线程是将数据备份到 A 数据库中,另外10 个线程将数据备份到 B 数据库中,并且备份 A 数据库和 备份 B 数据库的是交叉运行的。

二、实现
1、实现备份 A 数据库和备份 B 数据库的 task。
/**
* Description: 当flag=true的时候备份 A 数据库
* 当flag=false的时候备份 B数据库 以此实现交叉备份
*/
public class TaskBackup
{
volatile private boolean flag=false;// 采用volatile关键字,使变量于多个线程之间可见 synchronized public void backupA(){ //synchronized 关键字,避免多个线程对同一对象的修改,导致“脏读”
try {
//记住,这里的判断一定要用while 而不是用if,为什么呢?因为存在多个线程,不止备份B数据库的线程在等待,可能备份A数据库的线程也在等待,如果用if
//可能会导致 同类唤醒同类的 情况导致线程的“假死”。
while (flag==false){
this.wait();
}
System.out.println(Thread.currentThread().getName()+"正在备份 A 数据库!");//模拟备份数据库
flag=false;
this.notifyAll();//唤醒所有等待的线程,当然这里并不会唤醒backupA 的线程,原因在于,backupA的线程这个时候又做了一个while判断,导致线程继续在等待了,而只有backupB的线程被唤醒了
} catch (InterruptedException e) {
e.printStackTrace();
}
} synchronized public void backupB(){
try {
while (flag==true){
this.wait();
}
System.out.println(Thread.currentThread().getName()+"正在备份 B 数据库!");//模拟备份数据库
flag=true;
this.notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
2、分别创建线程执行 备份任务
public class ThreadBackupA extends Thread
{
private TaskBackup taskPackup; public ThreadBackupA(TaskBackup taskPackup)
{
this.taskPackup = taskPackup;
} @Override
public void run()
{
super.run();
taskPackup.backupA();
}
}
public class ThreadBackupB extends Thread
{
private TaskBackup taskPackup; public ThreadBackupB(TaskBackup taskPackup)
{
this.taskPackup = taskPackup;
} @Override
public void run()
{
super.run();
taskPackup.backupB();
}
}
3、执行任务查看结果
public class Run
{
public static void main(String[] args)
{
TaskBackup taskPackup=new TaskBackup();
for (int i=0;i<20;i++){
ThreadBackupA threadBackupA=new ThreadBackupA(taskPackup);
ThreadBackupB threadBackupB=new ThreadBackupB(taskPackup);
threadBackupA.start();
threadBackupB.start();
}
}
}

三、结语
觉得这个例子写得特别棒,所以特地记录了一下。它把 诸如 线程notify过程中 wait条件发生改变、同类唤醒同类导致的“假死”问题 等,都做了一个很好的概括应用和解决。笔主资历尚浅,说的不好的地方,还请不吝指教,谢谢!
wait/notify 实现多线程交叉备份的更多相关文章
- 《Java多线程编程核心技术》知识梳理
<Java多线程编程核心技术> @author ergwang https://www.cnblogs.com/ergwang/ 文章末尾附pdf和png下载链接 第1章 Java多线程技 ...
- MySQL多线程备份工具mydumper
mydumper是一个针对MySQL和Drizzle的高性能多线程的备份和恢复工具.此工具的开发人员分别来自MySQL.Fackbook.SkySQL公司,目前已经有一些大型产品业务测试并使用了该工具 ...
- java多线程编程核心技术——第三章
第一节等待/通知机制 1.1不使用等待/通知机制实现线程间的通讯 1.2什么是等待/通知机制 1.3等待/通知机制的实现 1.4方法wait()锁释放与notify()锁不释放 1.5当interru ...
- Java多线程编程核心技术(三)多线程通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- java多线程编程核心技术——第三章总结
第一节等待/通知机制 1.1不使用等待/通知机制实现线程间的通讯 1.2什么是等待/通知机制 1.3等待/通知机制的实现 1.4方法wait()锁释放与notify()锁不释放 1.5当interru ...
- 《JAVA多线程编程核心技术》 笔记:第三章:线程间通信
一. 等待/通知机制:wait()和notify()1.1.使用的原因:1.2 具体实现:wait()和notify()1.2.1 方法wait():1.2.2 方法notify():1.2.3 wa ...
- 《Java多线程编程核心技术》读后感(十)
一生产一消费:操作栈 本实例是使生产者向堆栈List对象中放入数据,使消费者从List堆栈中取出数据.List最大容量是1 package Third; import java.util.ArrayL ...
- Java多线程编程(三)线程间通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- Java多线程编程核心技术-第3章-线程间通信-读书笔记
第 3 章 线程间通信 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大 ...
随机推荐
- 基于 HTML5 WebGL 的 3D 仓储管理系统
仓储管理系统(WMS)是一个实时的计算机软件系统,它能够按照运作的业务规则和运算法则,对信息.资源.行为.存货和分销运作进行更完美地管理,使其最大化满足有效产出和精确性的要求.从财务软件.进销存软件C ...
- 34.Linux-printk分析、使用prink调试驱动
本节学习目的 1)分析printk()函数 2)使用prink()调试驱动 1.在驱动调试中,使用printk(),是最简单,最方便的办法 当uboot的命令行里的“console=tty1”时,表示 ...
- 一个for循环打印二维数组
#include<stdio.h> #define MAXX 2 #define MAXY 3 void printarray() { ,,,,,}; ;i< MAXX*MAXY;i ...
- Nova控制节点集群
#Nova控制节点集群 openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##Nova控制节点集群 # control ...
- Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)
service 的容器副本会 scale up/down,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果 service 有要管理的数据,那么这些数据应该如何存放呢? 选项一 ...
- 中英文代码对比系列之Java一例
原文: https://zhuanlan.zhihu.com/p/30905033. 作者为本人. 这个系列将对同一段代码进行中文命名和英文命名两个版本的比较. 目的包括, 演示中文命名, 发现命名时 ...
- 这一次带你彻底了解Cookie
前言 网络早期最大的问题之一是如何管理状态.简而言之,服务器无法知道两个请求是否来自同一个浏览器.当时最简单的方法是在请求时,在页面中插入一些参数,并在下一个请求中传回参数.这需要使用包含参数的隐藏的 ...
- SEO中TDK写法的意思以及注意事项
在SEO中,所谓的TDK其实就是title.description.keywords这三个标签,这三个标签在网站的优化过程中,至关重要所以今天童童来和大家分享下,如何去写好TDK标签! 1.title ...
- Netty4 学习笔记之三:粘包和拆包
前言 在上一篇Netty 心跳 demo 中,了解了Netty中的客户端和服务端之间的心跳.这篇就来讲讲Netty中的粘包和拆包以及相应的处理. 名词解释 粘包: 会将消息粘粘起来发送.类似吃米饭,一 ...
- 数据库文件*.sdf文件定时备份,但是大小的增量在不断增长的问题排查
在某项目上,使用SQL Server数据库,现场反馈每天定时备份数据库文件,每天的数据量是400多个申请单的量.之前每天增长量是50M,但是后来两天增长量是80M,每天的数据量差不多. 到底从什么地方 ...