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中提供了等待唤醒机制很好的解决了这个问题! 生产者消 ...
随机推荐
- 结对开发训练(郭林林&胡潇丹)
此次编程题为:求一个整数数组最大子数组之和,要求时间复杂度为O(n). 首先,我们对题目做出分析,做出第一种预行方案,即定义一个数组,当数组中元素大于等于0时,进行累加:若小于0,则与后面的数作比较, ...
- HttpServletRequest的Attribute和Parameter区别
HttpServletRequest类既有getAttribute()方法,也由getParameter()方法,这两个方法有以下的组件通过getParameter()方法来获得请求参数,例如假定we ...
- C2第八次解题报告
看过题解后如果觉得还算有用,请帮忙加点我所在团队博客访问量 http://www.cnblogs.com/newbe/ http://www.cnblogs.com/newbe/p/4069834.h ...
- Android--多媒体操作
---恢复内容开始--- 1.拍照,这里直接上代码,看注释就好 public void onCreate(Bundle savedInstanceState) { super.onCreate(sav ...
- sicily1024 Magic Island(图的遍历)
Description There are N cities and N-1 roads in Magic-Island. You can go from one city to any other. ...
- 微软再次要求Google审查官方链接 称将进行调查
之前代表微软向Google发出DMCA删除通知的反盗版公司再次要求Google审查Microsoft.com官网链接.微软对此表示将进行调查,已经要求反盗版公司停止以微软的名义发出DMCA通知. 仅仅 ...
- phoenix 开发API系列(一)创建简单的http api
安装 phoenix framework 安装 phoenix 很简单: mix archive.install https://github.com/phoenixframework/archive ...
- linux下用rpm包安装默认配置
rpm安装默认目录:数据文件:/var/lib/mysql/配置文件模板:/usr/share/mysqlmysql客户端工具目录:/usr/bin日志目录:/var/log/pid,sock文件目录 ...
- Couchbase N1QL
Couchbase的 N1QL已经DP4了,在官方的文档中,Select * From like-table 这个like-table实际上指的是Couchbase中Bucket,那么对于早起版本Co ...
- RCP:美化基于eclipse3.7.2的RCP界面
从e4开始,eclipse rcp界面具备了深度自定义的能力. 但是在eclipse3.7.2上,几乎没有提供能够用于修改界面的外部接口. 这里介绍一种方式来自定义你自己的eclipse rcp. 先 ...