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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

25 个回复

正序浏览
何亚辉 发表于 2016-6-7 14:12
package com.heima.IO;

import java.io.IOException;

六六六。。。
回复 使用道具 举报
按照你代码的意思,感觉没有问题。。。。。
回复 使用道具 举报
写错了  是  synchronized(this)
回复 使用道具 举报
把锁里的 Person换成this           synchronize(this)
回复 使用道具 举报
车前子008 发表于 2016-6-9 11:56
class Shangche implements Runnable{
               
        static int persons = 70;

问题解决了,这种写法可行!
        public static void main(String[] args) throws InterruptedException {
                        ByBus b = new ByBus();
                        Thread t1 = new Thread(b, "线程一");
                        Thread t2 = new Thread(b, "线程二");
                        t1.start();
                        t2.start();
                        t1.join();
                        t2.join();
                        System.out.println("执行完毕");
                }
        }

        class ByBus implements Runnable {
               
                public static int  persons = 70;
                public void run() {               
                        while (true) {
                        synchronized (ByBus.class) {
                                if(persons<=0)
                                        break;
                                        System.out.println(Thread.currentThread().getName() +-- persons);
                                }
                        }                               
                }
回复 使用道具 举报
车前子008 发表于 2016-6-9 11:56
class Shangche implements Runnable{
               
        static int persons = 70;

试了一下,这种方法虽然能保证数据同步,如果在while上面加锁,最后都是只一个线程走完,可以在run方法里调用其它的线程吗
回复 使用道具 举报
        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--);
                       
                }
                }
                }
                }
        }
回复 使用道具 举报

这样还是只能单线程。



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

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

是啊,这样是可以,但是这种写法,不能多线程,可能这就是这道题的难点所在。
回复 使用道具 举报
Fangjie 发表于 2016-6-7 16:03
试了下,是这个问题,但是最后一个线程执行的时候,怎么会是负数,它没有按照while(persons>0)的这个条件 ...

你是先判断才获取锁,肯定会出现这情况,你把判断放同步代码块里就 没事了
回复 使用道具 举报

试了下,是这个问题,但是最后一个线程执行的时候,怎么会是负数,它没有按照while(persons>0)的这个条件执行啊
回复 使用道具 举报
何亚辉 发表于 2016-6-7 14:15
问题就是, 你这个Person既做了变量, 又做了锁 .,.  这个锁一直在改变

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

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

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

试了下,数据顺序的问题解决了,但是最后的一个线程会出现负数,我的结束条件是>0的,怎么另一个线程没有按条件来。
回复 使用道具 举报
车前子008 发表于 2016-6-7 14:06
锁上的不对 锁必须是唯一的  你的这个变量是共享的呀  用this  或者Shangche.class试一试 ...

谢谢,试了下,是这个原因,但是数据还是有点不同步,会出现负数,不是我的循环条件是>0的,最后到了另一个线程的时候就会出现负数
回复 使用道具 举报
persons对象的数值一直在改变的啊  锁对象不是一个了    换个吧
回复 使用道具 举报
本帖最后由 何亚辉 于 2016-6-7 14:23 编辑

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

我试了下换成另一个不变的锁,,     就不存在这个问题了
回复 使用道具 举报
本帖最后由 何亚辉 于 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);
                        }

                }
        }
}
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马