A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 长石 中级黑马   /  2014-1-14 19:39  /  1661 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这是毕老师在视频提的一个例子  用synchronized解决多线程安全问题  
他说用单例设计模式也可以  但我试了几回都不对  求大神帮解决


  1. class Res{
  2.         String name;
  3.         String sex;
  4. }
  5. class Input implements Runnable{
  6.         private Res r;
  7.         public  Input(Res r){
  8.                 this.r = r;
  9.         }
  10.         public void run(){
  11.                 int x =0;
  12.                 while(true){
  13.                         synchronized(r){
  14.                                 if(x==0){
  15.                                         r.name = "mike";
  16.                                         r.sex = "男";
  17.                                 }else{
  18.                                         r.name = "lily";
  19.                                         r.sex = "女";
  20.                                 }
  21.                                
  22.                         }
  23.                         x = (x+1)%2;
  24.                 }
  25.         }
  26. }
  27. class Output implements Runnable{
  28.         private Res r;
  29.         public Output(Res r){
  30.                 this.r = r;
  31.         }
  32.         public void run(){
  33.                 while(true){
  34.                         synchronized(r){
  35.                                 System.out.println(r.name+"---"+r.sex);
  36.                         }
  37.                 }
  38.         }
  39. }
  40. public class InputOutputDemo01 {

  41.         public static void main(String[] args) {
  42.                 Res r = new Res();
  43.                
  44.                 Input in = new Input(r);
  45.                 Output out = new Output(r);
  46.        
  47.                 Thread t1 = new Thread(in);
  48.                 Thread t2 = new Thread(out);
  49.                 t1.start();
  50.                 t2.start();
  51.         }
  52. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 几番意难相付 于 2014-1-14 20:32 编辑

  1. <P>class test
  2. {
  3.         public static void main(String[] args){
  4.                 new Thread(new input()).start();
  5.                 new Thread(new output()).start();
  6.         }
  7. }

  8. class input implements Runnable
  9. {
  10.         person p=person.getInstance();
  11.         public void run(){
  12.                  int x =0;
  13.                 while(true){
  14.                                 synchronized(p){
  15.                                         if(x==0){
  16.                                                         p.name = "张三";
  17.                                                         p.sex = "男";
  18.                                         }else{
  19.                                                         p.name = "lili";
  20.                                                         p.sex = "女";
  21.                                         }
  22.                                 }
  23.                         x = (x+1)%2;
  24.                 }
  25.         }
  26. }
  27. class output implements Runnable
  28. {
  29.         person p=person.getInstance();
  30.         public void run(){
  31.                 while(true){
  32.             synchronized(p){
  33.                    System.out.println(p.name+"---"+p.sex);
  34.             }
  35.         }
  36.         }
  37. }</P>
  38. <P> </P>
  39. <P>//所谓的单例
  40. class person
  41. {</P>
  42. <P>        //将该类的构造方法私有
  43.         private person(){}</P>
  44. <P>      //在本类中创建一个本类的对象
  45.         private static person p=new person();</P>
  46. <P>     //定义静态方法 返回上面创建的本类对象 即使这个方法被多次调用 返回的也只是在本类中创建的这个对象 保证了唯一性
  47.         public static person getInstance(){
  48.                 return p;
  49.         }
  50.         String name;
  51.         String sex;
  52. }</P>
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
你没明白我的  毕老师是说  这个例子不用synchronized  用单例设计模式也可以解决同步问题
回复 使用道具 举报

你没明白我的  毕老师是说  这个例子不用synchronized  用单例设计模式也可以解决同步问题
回复 使用道具 举报
线程同步好像必须用到synchronized或者Lock,老师说的单例模式应该是指输入输出共同操作的资源吧?你倒回去仔细看看视频?
回复 使用道具 举报
长石 发表于 2014-1-15 09:31
你没明白我的  毕老师是说  这个例子不用synchronized  用单例设计模式也可以解决同步问题 ...

那是你会错意了,毕老的意思并不是说单例可以代替同步,而是说,单例可以保证一个对象在内存中的唯一性。
原例中说,是让两个线程共同操作同一个资源。着重点是“同一个资源”,而不是同步。
然后学生说,用单例。这时候的语境,是相当于“同一个资源”而言的,并不是说,单例能解决线程安全。
然后毕老说,用单例可以,但是单例麻烦。他用的是在主函数中创建一个资源的对象,然后将这一个资源对象,作为参数传递给不同的线程执行操作。这样,多个线程操作的,只能是在主函数里建立的那唯一一个资源对象。
单例,上面说了,保证了对象在内存中的唯一性。也就相当于在主函数里建立一个对象分别给不同的线程操作。


线程安全问题,只能用同步,别无他法。要么synchronized,要么lock,再没有什么能够代替这两个。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
长石 中级黑马 2014-1-15 12:37:42
7#
几番意难相付 发表于 2014-1-15 10:29
那是你会错意了,毕老的意思并不是说单例可以代替同步,而是说,单例可以保证一个对象在内存中的唯一性。 ...

谢谢耐心解答
回复 使用道具 举报
这么长,啊,看不下去。。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马