import java.util.Random;public class Test0_5 {
// 一个标志值

private static Object object = new Object(); //用来测试synchronized private static int flag = 1; public static void main(String[] args) { new Thread("Thread-01") { public void run() {
new Test0_5().operate();
} }.start(); // 启动第一个线程 new Thread("Thread-02") { public void run() { new Test0_5().operate(); } }.start(); // 启动第二个线程 } public void operate() {

synchronized (this){                     // 方法一...........不能起到同步的效果 //synchronized (Test0_5.class) {         //方法二............同样不能

//synchronized (object){                 //方法三............同样不能 flag++; try { // 增加随机性,让不同线程能在此交替执行 Thread.sleep(new Random().nextInt(5)); } catch (InterruptedException e) { e.printStackTrace(); } flag--;
} System.out.println("Thread: " + Thread.currentThread().getName() + " /Current flag: " + flag); }}
/*方法二和方法三应该是对的 ,但输出结果中任然看到
Thread: Thread-01 /Current flag: 2
Thread: Thread-02 /Current flag: 1
这种结果*/

解决方案 »

  1.   

    如果是原子操作,正确的输出结果应该是
    Thread: Thread-01 /Current flag: 1
    Thread: Thread-02 /Current flag: 1
      

  2.   

    第一种是不行的,因为两个线程都生成新的Test_05对象,然后调用operate方法,各用各的,所以起不到同步的作用,第二和第三种是可行的,因为flag是class variable,所以需要同步Test_05的一些静态的东西,二和三是可行的,只是您的同步块太小了,会在打印flag之前释放锁,然后发生切换打印出2的情况(为什么2对另外的线程可见,小弟还没研究内存模型,所以不知道)。总之,把打印flag那条语句放到同步块里去就可以达到目的了。
      

  3.   

    建议贴成java代码格式,这样没法看啊
      

  4.   

    二三可以同步,为何结果看不到同步,是因为你没有把
    System.out.println("Thread: " + Thread.currentThread().getName()+ " /Current flag: " + flag);放在同不块中,所以打印没有同步