首页 > 代码库 > java多线程的等待唤醒机制及如何解决同步过程中的安全问题
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(); }}*//*输出的结果:哈哈哈.....manhjz.....manhjz.....man哈哈哈.....manhjz.....女女女女*///线程安全隐患出现:首先考虑到是多线程操作了同一资源,所以要用同步!/* 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(); }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。