synchronized共享后还是只跑一个线程

V____Loren 2017-02-17 11:05:20
刚学线程,像视频一样学着用synchronized
共享后还是只跑一个线程.
就算把票调到1000也只有一个线程在跑.
后面试了下在锁后面设置多一个睡眠.还是只有一个线程在跑.
如果把synchronized去掉就4个线程都有跑.

package javapratice;

class Ticket implements Runnable{
private int tick = 100;
Object obj = new Object();
public void run(){
synchronized (obj) {
for(;tick>0;){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread().getName()+"------ sell---"+tick--);
}
}
}
}

class TestDemo {
public static void main(String[] args) {
Ticket t = new Ticket();

Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}



100张都是.就不截全部了
...全文
254 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu15073458538 2017-06-27
  • 打赏
  • 举报
回复
尚硅谷 我也看到这里了 和你一样的问题
  • 打赏
  • 举报
回复
楼上说的是对的。不过可以试下把synchronized 放在for里面执行。
  • 打赏
  • 举报
回复
卖票的时候还要判断一下,当前是否有票

   for(;tick>0;){
         synchronized (obj) {   
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
            }
        if(tick>0){
            System.out.println(Thread.currentThread().getName()+"------ sell---"+tick--);
        }
 }
        }
  • 打赏
  • 举报
回复
看清楚你要同步的代码是什么
synchronized (obj) {
        for(;tick>0;){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
            }
        System.out.println(Thread.currentThread().getName()+"------ sell---"+tick--);
        }
        }
你这个同步快把for循环包含了,那就是哪个线程拿到锁就卖完了啊 你要同步的是买票就是 System.out.println(Thread.currentThread().getName()+"------ sell---"+tick--); 把for循环拿到同步快外面就行了。
xuyanzhuo 2017-02-17
  • 打赏
  • 举报
回复
synchronized锁住第一个线程之后,然后执行for循环把100张票都卖完了。 第二个线程进来就没票了啊~~~ 把for循环去掉,再试一下吧。
V____Loren 2017-02-17
  • 打赏
  • 举报
回复
引用 3 楼 lonrence 的回复:
卖票的时候还要判断一下,当前是否有票

   for(;tick>0;){
         synchronized (obj) {   
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
            }
        if(tick>0){
            System.out.println(Thread.currentThread().getName()+"------ sell---"+tick--);
        }
 }
        }
明白了,谢谢
代码下载链接: https://pan.quark.cn/s/a8fbca3925b4 《鸿蒙OS开发环境构建》指南系统性地阐述了配置和筹备鸿蒙OS开发所需的各种工具和条件的具体方法。鸿蒙OS,亦称HarmonyOS,是由华为研发的一款面向全场景的分布式操作系统,其目标是提供跨平台、多设备间无缝协作的使用体验。本指南涉及了从Linux服务器到Windows工作站的完整开发流程。指南中提及了MobaXterm,这是一款用于连接Linux源码服务器的软件,使得开发人员能够在Windows环境中远程访问Linux服务器。同时,HiTool作为烧录工具,用于将编译后的系统镜像写入开发板。IPOP.EXE则是一款串口终端软件,用于执行串行通信和调试任务。Embedded Studio用于开发设备驱动程序,而DevEco Studio是华为提供的图形化应用程序开发平台,支持C/C++语言,拥有代码编辑、编译、烧录和调试功能,被视为OpenHarmony智能设备开发者的首选集成开发环境。在硬件配置方面,指南列出了必需的设备,包括Linux服务器(推荐Ubuntu 16.04及以上版本),Windows工作台(兼容XP/7/10),以及Hi3518EV300 IoT Camera单板。开发期间,Windows工作台通过USB线与单板相连接,以实现数据传输。此外,为了开展开发工作,还需要安装putty、IPOP、tftp服务器等辅助软件,以及HiTool用于烧录操作。在软件系统要求方面,Linux服务器需要安装bash、Python3.7+、gn、ninja、LLVM等构建工具,这些工具对于生成和执行编译脚本具有关键作用。在Windows工作台上,建议采用Visual Studi...

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧