java多线程问题

am_309003513 2014-10-22 06:59:41
/**
这是一个单例,保证每个线程调用的都是同一个对象的K
*/

class single
{
private int k;
private single()
{
k=1000;
};
static single s = new single();

public static single getInstance()
{
return s;
}
public int getK()
{
return k;
}
public void setK( int k)
{
this.k = k;
}
}

/**
实现Runnable接口
*/

class test implements Runnable
{
Object obj = new Object();
public void run()
{
synchronized(obj)
{
while(true)
{
if(single.getInstance().getK()>0)
{
System.out.println(Thread.currentThread().getName()+"----"+single.getInstance().getK());
single.getInstance().setK(single.getInstance().getK()-1);
}
}
}
}
}




class Ticket
{
public static void main(String[] args)
{

test t = new test();
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();


}
}

这是一个用单例实现的多线程火车售票的例子,当票数k设定为100时,只有线程0执行,然后将票数改为1000,dos界面只输出1~298的结果,而且都是线程0执行的,这是多次测试的结果。
请问大神为什么其他的三个线程没有工作
...全文
232 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
村夫大胡子 2014-10-24
  • 打赏
  • 举报
回复
引用 2 楼 am_309003513 的回复:
引用 1 楼 tianyutaizi 的回复:
4个线程共同访问obj 对象,其中一条线程得到obj对象锁,其他的一直在等待,也就是你所谓的不工作
把那个地方进行修改后实现了多线程,但是将k值设为1000后,为什么程序只打印出300张票就不再执行了呢



package com.excel;

public class TestTicket {

public static void main(String[] args) {

Test t = new Test();
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();
}
}

class single {
private int k;

private single() {
k = 1000;
};

static single s = new single();

public static single getInstance() {
return s;
}

public int getK() {
return k;
}

public void setK(int k) {
this.k = k;
}
}

/**
* 实现Runnable接口
*/

class Test implements Runnable {
Object obj = new Object();

public void run() {
while (true) {
synchronized (obj) {

if (single.getInstance().getK() > 0) {
System.out.println(Thread.currentThread().getName()
+ "----" + single.getInstance().getK());
single.getInstance().setK(single.getInstance().getK() - 1);
}
}
}
}
}



没有问题,可能是你看错了
村夫大胡子 2014-10-24
  • 打赏
  • 举报
回复

synchronized(obj)
{
    while(true)
    {
        if(single.getInstance().getK()>0)
        {
             System.out.println(Thread.currentThread().getName()+"----"+single.getInstance().getK());
             single.getInstance().setK(single.getInstance().getK()-1);
        }
    }
}
首先,你用了一个锁,而且你把while(true)放在了同步代码块里面还没有break,那么,这个对象锁永远也不会释放,所以也就只有被第一个持有的线程永久持有了。。。别的线程只能永久等待。。。。
qq_18509623 2014-10-23
  • 打赏
  • 举报
回复
public class Ticket { public static void main(String[] args){ test t = new test(); 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(); } } 与你之前的代码的结果是一样的,这说明只有t1线程在执行,其他的线程没有执行,跟本没有实现多线程, 而且当t1进入方法锁后,K值减为0后,后面的线程进入run()方法时,if语句已经失效,说以一直会是一条线程。
am_309003513 2014-10-22
  • 打赏
  • 举报
回复
引用 1 楼 tianyutaizi 的回复:
4个线程共同访问obj 对象,其中一条线程得到obj对象锁,其他的一直在等待,也就是你所谓的不工作
把那个地方进行修改后实现了多线程,但是将k值设为1000后,为什么程序只打印出300张票就不再执行了呢
-天宇 2014-10-22
  • 打赏
  • 举报
回复
4个线程共同访问obj 对象,其中一条线程得到obj对象锁,其他的一直在等待,也就是你所谓的不工作

62,621

社区成员

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

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