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中提供了等待唤醒机制很好的解决了这个问题! 生产者消 ...
随机推荐
- dom4j解析xml的增加信息
想要在xml中增加信息,那么就要先找到你要加信息的节点 前三行是固定模式,主要是找到xml文件的地址,并且得到根节点,再从根节点中便利出来movie的所有节点之后用集合接收 SAXReader rea ...
- php CLI 模式下的传参方法
在CLI模式(命令行界面 Command Line Interface)下,传入参数有如下3种方法: 一. getopt函数(PHP 4 >= 4.3.0, PHP 5) getopt - 从命 ...
- 在自定义TableViewCell类里面添加按钮事件触发不了的一些实践
我的自定义cell上面有5个控件,分别是一个背景的UIImageView,一个专辑的UIImageView(上面加了一个播放的button),一个专辑名字的UIImageView(上面加了显示标题的U ...
- HDU-4869 Turn the pokers
原题: Turn the pokers 思路:假设正面为0,反面为1.牌就像这样 000000....... .考虑到假如可以实现最终反面个数为m, 牌共n张, 则这n张排任取m个为反面 ...
- sshd 错误
140669086946976:error:0E079065:configuration file routines:DEF_LOAD_BIO:missing equal sign:conf_def. ...
- 【leetcode】Pow(x,n)
马上各种校招要开始了,怎么也得准备一下,之前一直在看看机器学习,NLP方面的东西,收获很多.最近换换脑子,回过头来做做leetcode,感觉还是蛮有意思的.今天刷了个水题,AC不高,然而难度也不高.. ...
- fuck me on github
前几天写了一篇<博客园添加Fork me on GitHub彩带>,有博友评论,说他看到有的彩带上写着“Fuck me on GitHub”,当时我就笑喷了,有意思,哈哈! 昨天正好有时间 ...
- EF6(CodeFirst)+MySql开发脱坑指南
废话 话说当年,在一个春光明媚的晌午,邂逅了迷人的丁香姑娘,从此拜倒在了她的石榴裙下,至今不能自拔,这位丁香姑娘就是ORM思想. 所谓ORM思想,我的理解就是根据一定的规则,把程序中的对象和数据库中的 ...
- Javascript自己动手实现getter/setter
虽然ES5中为我们提供了Object.defineProperty方法来设置getter与setter,但此原生方法使用起来并不方便,我们何不自己来实现一个类,只要继承该类并遵循一定的规范就可以拥有媲 ...
- node.js调试
用了几天node.js感觉很新奇,但是调试问题实在是愁煞人,开始的时候懒的学习调试方法,看看异常内容就可以了,但随着代码复杂程度的上升,并不是所有错误都是语法错误了,不调试搞不定了,只好搜搜资料,学习 ...