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 线程在运行呢? 如图 展开
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 线程在运行呢? 如图 展开
6个回答
展开全部
这个跟CPU性能有关, 完全一致的代码在我的电脑和公司的电脑上, 发现CPU对线程调度与执行速度不一致, 实际测试过,性能好的CPU需要大量增加线程循环执行次数, 我的机器上是10000次), 才能看到其他线程的执行, 而公司的电脑只要循环10次, 就能看到别的线程执行了
当sleep在synchronized同步方法或同步块之外的时候,三个线程都有执行, 是因为sleep方法会给其他线程运行的机会,而不管其他线程的优先级, (但在synchronized同步方法里的sleep, 由于被锁住所以没有优先级之说, 也就是说synchronized同步方法里的sleep失效了, 这是我的猜想)
想看到线程具体的执行过程,可以打开JDK bin目录下的jvisualvm.exe 监视JavaJVM的状态,如图:
展开全部
java中 synchronized同步处理后,代表该线程是同步的,即多线程访问时,无法同时有两个或以上线程进行访问。具体的原理是,当第一个线程进入该同步代码块之后,会暂时获得同步块的锁,当第二个线程进入时,由于第一个线程并未结束,同步代码块的锁没有释放,所以第二个线程进不来,达到只有一个线程在运行的目的。synchronized同步处理通常用于封装需要共享的可改变的数据,为了让数据更安全所使用的技术。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
线程这个现象不好解释,可能是你电脑运算速度太快了,一个线程在它没有被中断之前就把任务全部完成了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
.修改了一下.,,这样应该没问题
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--);
}
}
}
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给它分配的时间也刚好用完,下一个排队的线程才会运行
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这个是随机的~不一定走哪个线程的~你多运行几遍就好了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询