java中 synchronized同步处理后 为什么只有一个线程在运行呢?

publicclassThreadDemo9_51{publicstaticvoidmain(String[]args){TextThreadt=newTextThrea... public class ThreadDemo9_51 {
public static void main(String[] args) {
TextThread t=new TextThread();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class TextThread implements Runnable {
private int tickets=20;
public void run() {
while(true) {
synchronized(this) {
if(tickets>0) {
try {
Thread.sleep(100);
}
catch(Exception x) {}
System.out.println(Thread.currentThread().getName()+" 售出票 "+tickets--);
}
}
}
}
}

代码中,我明明设置了4个线程,为什么结果只有一个 Thread-0 线程在运行呢? 如图
展开
 我来答
郭康雨
2019-06-19 · TA获得超过331个赞
知道小有建树答主
回答量:116
采纳率:60%
帮助的人:20.2万
展开全部
  1. 这个跟CPU性能有关, 完全一致的代码在我的电脑和公司的电脑上, 发现CPU对线程调度与执行速度不一致, 实际测试过,性能好的CPU需要大量增加线程循环执行次数, 我的机器上是10000次), 才能看到其他线程的执行, 而公司的电脑只要循环10次, 就能看到别的线程执行了

  2. 当sleep在synchronized同步方法或同步块之外的时候,三个线程都有执行, 是因为sleep方法会给其他线程运行的机会,而不管其他线程的优先级, (但在synchronized同步方法里的sleep, 由于被锁住所以没有优先级之说, 也就是说synchronized同步方法里的sleep失效了, 这是我的猜想)

  3. 想看到线程具体的执行过程,可以打开JDK bin目录下的jvisualvm.exe  监视JavaJVM的状态,如图:

颜骏寒
推荐于2017-10-05 · TA获得超过4535个赞
知道大有可为答主
回答量:3630
采纳率:50%
帮助的人:1462万
展开全部
java中 synchronized同步处理后,代表该线程是同步的,即多线程访问时,无法同时有两个或以上线程进行访问。具体的原理是,当第一个线程进入该同步代码块之后,会暂时获得同步块的锁,当第二个线程进入时,由于第一个线程并未结束,同步代码块的锁没有释放,所以第二个线程进不来,达到只有一个线程在运行的目的。synchronized同步处理通常用于封装需要共享的可改变的数据,为了让数据更安全所使用的技术。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhuyatao00
2012-02-28
知道答主
回答量:4
采纳率:0%
帮助的人:3.3万
展开全部
线程这个现象不好解释,可能是你电脑运算速度太快了,一个线程在它没有被中断之前就把任务全部完成了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
没有响应m2
推荐于2017-09-11 · TA获得超过8387个赞
知道大有可为答主
回答量:7579
采纳率:33%
帮助的人:3445万
展开全部
.修改了一下.,,这样应该没问题
class TextThread implements Runnable {
private int tickets=20;
public void run()
{
for(int i=0;i<=20;i++) {
go();
}
}
public synchronized void go() {

if(tickets>0) {
try {
Thread.sleep(100);
}
catch(Exception x) {}
System.out.println(Thread.currentThread().getName()+" 售出票 "+tickets--);
}
}
}
追问
我个人认为有可能是因为Thread-0 运行 synchronized 里包含的代码时 cpu给他分配的时间用完了,但是运行在synchronized中的线程不能被暂停,所以cpu又重新给他分配了时间。于是可能出现的情况是在Thread-0运行完synchronized后,cpu给它重新分配的时间还没用完,然后它就又开始运行了synchronized。。。。于是Thread-0悲惨的循环下去,直到它刚运行完synchronized的同时cpu给它分配的时间也刚好用完,下一个排队的线程才会运行
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
雷小音
2012-02-28
知道答主
回答量:29
采纳率:0%
帮助的人:18.4万
展开全部
你这个是随机的~不一定走哪个线程的~你多运行几遍就好了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式