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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我加了同步锁的,怎么结果还是不对!

25 个回复

倒序浏览
你想要什么结果?
回复 使用道具 举报
你试试看把下面的if判断写到同步锁的第一句话,,
回复 使用道具 举报

顺序结果,就是从70一自减到0
回复 使用道具 举报

顺序结果,就是从70一直自减到0
回复 使用道具 举报
何亚辉 发表于 2016-6-7 13:43
你试试看把下面的if判断写到同步锁的第一句话,,

试了的,还是不行,用了多线程,就不能保证数据的同步了吗
回复 使用道具 举报
锁上的不对 锁必须是唯一的  你的这个变量是共享的呀  用this  或者Shangche.class试一试
回复 使用道具 举报
本帖最后由 何亚辉 于 2016-6-7 14:21 编辑

package com.heima.IO;

import java.io.IOException;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;

public class Day1_ClassTest2 {
        public static void main(String[] args) throws IOException {
                shangche sc = new shangche();
                new Thread(sc, "线程一").start();
                new Thread(sc, "线程二").start();

        }

}

class shangche implements Runnable {

        int person = 70;
        Object o = new Object();

        public void run() {
                while (person>0) {
                        synchronized (o) {
                                if (person <= 0) {
                                        return;
                                }
                                System.out.println(Thread.currentThread().getName() + "自减"+--person);
                        }

                }
        }
}
回复 使用道具 举报
本帖最后由 何亚辉 于 2016-6-7 14:23 编辑

问题就是, 你这个Person既做了变量, 又做了锁 .,.  这个锁一直在改变

我试了下换成另一个不变的锁,,     就不存在这个问题了
回复 使用道具 举报
persons对象的数值一直在改变的啊  锁对象不是一个了    换个吧
回复 使用道具 举报
车前子008 发表于 2016-6-7 14:06
锁上的不对 锁必须是唯一的  你的这个变量是共享的呀  用this  或者Shangche.class试一试 ...

谢谢,试了下,是这个原因,但是数据还是有点不同步,会出现负数,不是我的循环条件是>0的,最后到了另一个线程的时候就会出现负数
回复 使用道具 举报
何亚辉 发表于 2016-6-7 14:15
问题就是, 你这个Person既做了变量, 又做了锁 .,.  这个锁一直在改变

我试了下换成另一个不变的锁,,      ...

试了下,数据顺序的问题解决了,但是最后的一个线程会出现负数,我的结束条件是>0的,怎么另一个线程没有按条件来。
回复 使用道具 举报
何亚辉 发表于 2016-6-7 14:15
问题就是, 你这个Person既做了变量, 又做了锁 .,.  这个锁一直在改变

我试了下换成另一个不变的锁,,      ...

试了下,数据顺序的问题解决了,但是最后的一个线程会出现负数,我的结束条件是>0的,怎么另一个线程没有按条件来。
回复 使用道具 举报

试了下,是这个问题,但是最后一个线程执行的时候,怎么会是负数,它没有按照while(persons>0)的这个条件执行啊
回复 使用道具 举报
Fangjie 发表于 2016-6-7 16:03
试了下,是这个问题,但是最后一个线程执行的时候,怎么会是负数,它没有按照while(persons>0)的这个条件 ...

你是先判断才获取锁,肯定会出现这情况,你把判断放同步代码块里就 没事了
回复 使用道具 举报
jijiangrui 发表于 2016-6-7 17:18
你是先判断才获取锁,肯定会出现这情况,你把判断放同步代码块里就 没事了  ...

是啊,这样是可以,但是这种写法,不能多线程,可能这就是这道题的难点所在。
回复 使用道具 举报

回复 使用道具 举报
换成persons--
回复 使用道具 举报

这样还是只能单线程。



回复 使用道具 举报
        class Shangche implements Runnable{
               
        static int persons = 70;
        public void run(){
                while(true){
                synchronized (Shangche.class){
                if(persons>0){
                        System.out.println(Thread.currentThread().getName()+persons--);
                       
                }
                }
                }
                }
        }
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马