我想问一下,如何模拟2个线程同时调用同一个对象同一个字段的get和set,即一个线程调用get,一个调用set,好让他们出现问题,这样我才能模拟多用户访问共享数据

解决方案 »

  1.   

    应该不会出问题。。get最多返回null
      

  2.   

    定义一个类,在主方法中,new两个线程就可以了。
      

  3.   

    如果2个线程同时读取,存储一个内存地址,就会出问题。
    不过一个控制get,一个控制set是不会出现问题。为保险,防出问题,你可以加个Synchronized 在get和set的墙面。
      

  4.   

    其实我现在要的就是出错,不出错我就不知道怎么改进,怎么用Synchronized优化,能不能给个出错的例子
      

  5.   

    简单的说,我就是想知道有Synchronized和没有Synchronized的明显效果
      

  6.   

    没有什么问题只是会出现脏数据,用Synchronized就可解决数据共享问题
      

  7.   

    我有一个类A,类里有一个字段number 和一个countNumber方法用来++number然后输出number的新值,现在要在main里创建唯一的A的实例,创建100个线程重复调用countNumber, 目的是使最后结果不是100,就是要出现脏数据。高人能不能写出来啊,我的重点是要出现脏数据。简单的说我要的是一个反面例子
      

  8.   

    我知道可以用Synchronized就可解决数据共享问题,但我现在需要的是一个反面例子。
      

  9.   

    set线程先出发,get线程后发但先至,得到的就是脏数据,此数据在被set更新之后业务上无效
    这种情况只要多试几次就会出现,或者认为在set线程中加延时
      

  10.   

    set线程先出发,get线程后发但先至,得到的就是脏数据,此数据在被set更新之后业务上无效
    这种情况只要多试几次就会出现,或者认为在set线程中加延时
      

  11.   


    public class ProblemClass extends Thread {
        static int problemcount;
        private boolean getflag;
        public ProblemClass(boolean iget) {
            problemcount = 0;
            getflag = iget;
        }    public int getcount() {
            return problemcount;
        }    public void setcount(int x) {
            problemcount = x;
        }    public void run() {
            if (getflag) {
                while (true) {
                    if (problemcount % 2 == 0) {
                        //这里故意做点事情耽搁点时间,制造问题
                        for (int p = 0; p < 1000; p++) {} //囧rz
                        //-------------------------------
                        int temp = getcount();
                        System.out.println("获得偶数:" + temp);
                    }
                }
            } else {
                int i = 0;
                while (true) {
                    //这里故意做点事情耽搁点时间,制造问题
                    for (int p = 0; p < 1000; p++) {} //囧rz
                    //-------------------------------
                    i++;
                    setcount(i);
                }
            }
        }
    }public class TestProblem {
        public TestProblem() {
        }
        public static void main(String[] _s){
            ProblemClass a = new ProblemClass(true);
            ProblemClass b = new ProblemClass(false);
            a.start();
            b.start();
        }
    }这个很容易跑出问题来,一大饼的奇数
      

  12.   

    可以看到如果有线程同时读取,会有问题。
    import java.util.Random;public class SyncIssueImpl { private int number = 0;

    public void countNumber() {
    String currentName = Thread.currentThread().getName();
    int currentNumber = getNumber();
    System.out.println("Thread [" +currentName+"] read number as [" + currentNumber + "]");
    currentNumber++;

    System.out.println("Thread [" +currentName+"] set number as [" + currentNumber + "]");
    setNumber(currentNumber);
    }

    public void setNumber(int newNumber) {
    String currentName = Thread.currentThread().getName();
    System.out.println("Thread [" +currentName+"] set "
    + "current number [" + this.number + "] to new number [" + newNumber + "]" );

    if (this.number >= newNumber) {
    System.out.println("Thread [" +currentName+"] find error! "
    + "current number [" + this.number + "] >= new number [" + newNumber + "]" );
    throw new RuntimeException("Sync error found!");
    } this.number = newNumber;
    }

    public int getNumber() {
    return this.number;
    }

    /**
     * 
     */
    public SyncIssueImpl() {
    } /**
     * @param args
     */
    public static void main(String[] args) {
    int waitTime = 1; //Minutes
    int numOfThread = 4;
    Thread[] threads = new Thread[numOfThread];
    final SyncIssueImpl impl = new SyncIssueImpl();


    for (int i = 0; i < threads.length; ++i) {
    threads[i] = new Thread(new Runnable() {
    @Override
    public void run() {
    boolean continued = true;
    Random rnd = new Random();

    while (continued) {
    try {
    impl.countNumber();

    Thread.sleep(rnd.nextInt() % 60 + 10);
    } catch (Exception e) {
    continued = false;
    }
    }
    }
    }); threads[i].setName("Tester" + i);
    }

    for (int i = 0; i < threads.length; ++i) {
    threads[i].start();
    }

    try {
    for (int i = 0; i < threads.length; ++i) {
    threads[i].join(waitTime * 60000);
    }

    } catch (Exception e) {
    System.out.println("error found : " + e);
    e.printStackTrace();
    }
    }
    }
      

  13.   

    经过几天地对java并发编程的学习,有点明朗啦,谢谢各位啦