java多线程的等待唤醒机制及如何解决同步过程中的安全问题
/*
class Person{
String name;
String sex;
boolean flag = true;
public void setPerson(String name, String sex){
this.sex=sex;
this.name=name;
}
}
class Input implements Runnable{
int x=0;
Person p;
Input(Person p){
this.p=p;
}
public void run(){
while(true){
if(x==1){
p.setPerson("hjz", "man");
}
else p.setPerson("哈哈哈", "女女女女");
x=(x+1)%2;
}
}
} class Output implements Runnable{
int x=0;
Person p;
Output(Person p){
this.p=p;
}
public void run(){
while(true){
System.out.println(p.name + "....." + p.sex);
}
}
}
public class Test{
public static void main(String[] args){
Person p = new Person();
new Thread(new Input(p)).start();
new Thread(new Output(p)).start();
}
}
*/ /*
输出的结果:
哈哈哈.....man
hjz.....man
hjz.....man
哈哈哈.....man
hjz.....女女女女
*/ //线程安全隐患出现:首先考虑到是多线程操作了同一资源,所以要用同步!
/*
class Person{
String name;
String sex;
boolean flag = true;
public void setPerson(String name, String sex){
this.sex=sex;
this.name=name;
}
} class Input implements Runnable{
int x=0;
Person p;
Input(Person p){
this.p=p;
}
public void run(){
while(true){
synchronized(new Object()){
if(x==1){
p.setPerson("hjz", "man");
}
else p.setPerson("哈哈哈", "女女女女");
x=(x+1)%2;
}
}
}
} class Output implements Runnable{
int x=0;
Person p;
Output(Person p){
this.p=p;
}
public void run(){
while(true){
System.out.println(p.name + "....." + p.sex);
}
}
}
public class Test{
public static void main(String[] args){
Person p = new Person();
new Thread(new Input(p)).start();
new Thread(new Output(p)).start();
}
}
*/ //同步完成之后,发现还是出现安全隐患的情况,在考虑一下是否访问统一资源的多个线程用的是同一个锁!
//本例中的应将输入输出一起同步(注意输入输出不在同一个线程之中,输出线程不会获得 Person p对象的控制权!)
/* class Input implements Runnable{
int x=0;
Person p; Input(Person p){
this.p=p;
}
public void run(){
while(true){
synchronized(p){
if(p.flag){
try{
p.wait();
}catch(InterruptedException e){
}
}
if(!p.flag){
if(x==1){
p.setPerson("hjz", "man");
}
else p.setPerson("哈哈哈", "女女女女");
x=(x+1)%2;
} p.flag=true;
p.notify(); }
}
}
} */ //现在的代码是将同步放到函数里!真正开发过的时候就是这样实现,也就是我们多个线程同事操作一个类对象
//调用该类提供的对外方法,并将调用的方法进行同步!防止安全隐患!
class Person{
String name;
String sex;
boolean flag = true;
public void setPerson(String name, String sex){
synchronized(this){
if(!flag){
try{
wait();
}catch(InterruptedException e){}
}
if(flag){
this.sex=sex;
try{
Thread.sleep(100);
}catch(InterruptedException e){}
this.name=name;
}
flag=false;
notify();
}
} public void outPerson(){
synchronized(this){
if(flag){
try{
wait();
}catch(InterruptedException e){}
}
if(!flag){
System.out.println(name + "....." + sex);
}
flag=true;
notify();
}
}
} class Input implements Runnable{
int x=0;
Person p; Input(Person p){
this.p=p;
}
public void run(){
while(true){
if(x==1){
p.setPerson("hjz", "man");
}
else p.setPerson("哈哈哈", "女女女女");
x=(x+1)%2;
}
}
} class Output implements Runnable{
int x=0;
Person p;
Output(Person p){
this.p=p;
}
public void run(){
while(true){
p.outPerson();
}
}
} public class Test{
public static void main(String[] args){
Person p = new Person();
new Thread(new Input(p)).start();
new Thread(new Output(p)).start();
}
}
java多线程的等待唤醒机制及如何解决同步过程中的安全问题的更多相关文章
- java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)
*java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时 ...
- java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)
1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以 ...
- java 22 - 17 多线程之等待唤醒机制(接16)
先来一张图,看看什么叫做等待唤醒机制 接上一章的例子. 例子:学生信息的录入和获取 * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread( ...
- Java第二十五天,多线程之等待唤醒机制
当线程被创建并且被启动之后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,而是具有以下多种状态: 这六种状态之间的转换关系如下: 1.等待唤醒机制 注意: (1)两个线程之间必须用同步代码块 ...
- Java学习:等待唤醒机制
等待唤醒机制 线程的状态 NEW 至今尚未启动的线程处于这种状态 RUNNABLE 正在Java虚拟机中执行的线程处于这种状态 BLOCKED 受阻塞并等待某个监视器锁的线程处于这种状态 WA ...
- java锁在等待唤醒机制中作用
等待的线程放在线程池wait().notify().notifyall()都使用在同步中,因为要对持有监视器(锁)的线程操作.所以要使用在同步中,因为只有同步才具有锁. 为什么这些操作的线程的方法要定 ...
- Android(java)学习笔记71:生产者和消费者之等待唤醒机制
1. 首先我们根据梳理我们之前Android(java)学习笔记70中关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 pac ...
- Android(java)学习笔记11:生产者和消费者之等待唤醒机制
1. 首先我们根据梳理我们之前Android(java)学习笔记70中,关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 下面 ...
- 多线程之Java中的等待唤醒机制
多线程的问题中的经典问题是生产者和消费者的问题,就是如何让线程有序的进行执行,获取CPU执行时间片的过程是随机的,如何能够让线程有序的进行,Java中提供了等待唤醒机制很好的解决了这个问题! 生产者消 ...
随机推荐
- 重新开源UDS
这个题目起得很纠结. 因为很多人都知道UDS本来就是开源,我只不过改了一些东西,然后重新发布,所以不算重新开源. 要说重新发布也不对.因为老早这东西就发布了. 最后我想,这个东西已经很久没更新过了,也 ...
- android wifi obtainmessage sendmessage解析
obtainmessage 从message pool获取一个对象 sendmessage 将message插入message queue java中wait和notify是一对,wait进入睡眠等待 ...
- Visual Studio2013(Update4)无法生成依赖项关系图解决方案
今天为了看别人写的一套框架,就琢磨着有没视图的方式去看别人每个类和方法之间的调用和继承关系.这个时候发现了一个VS2013自带的功能: 带着兴奋的心情小手一抖一点... 我等呀等,等呀等.... 尼玛 ...
- android user build serial console
在 init.rc 里有一段 on property:ro.debuggable=1 start console 当user debug时 ro.debuggable=0,console 不会被启动 ...
- Java提高篇(三二)-----List总结
前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...
- 将整数转换成二进制的java小程序
首先我们知道,将整数转换成二进制是将整数除二取余将最后除得的数和得到的余数从下向上写,组成得到的二进制数. java程序实现如下: public class ChangeToErjinzhi { pu ...
- UWP入门教程1——UWP的前世今生
目录 引言 设备族群 UI 和通用输入模式 通用控件和布局面板 工具 自适应扩展 通用输入处理 引言 在本篇文章中,可以掌握以下知识: 设备族群,如何决定目标设备 新的UI控件和新面板帮助你适应不同的 ...
- C++ 引用
本文主要记录了C++中的引用特性,总结了一下代码示例和错误. 简单的引用 引用是C++的特性,指针是C语言的特性.上面代码结果如下: 20 20 100 20 true 引用和被引用的对象是占用同一个 ...
- 【团队分享之二】IT团队绩效提升的一些见解
- 我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器
回到目录 AOP面向切面的编程,也称面向方面的编程,我更青睐于前面的叫法,将一个大系统切成多个独立的部分,而这个独立的部分又可以方便的插拔在其它领域的系统之中,这种编程的方式我们叫它面向切面,而这些独 ...