java 多线程问题

packagethread;//JAVA多线程编程。用JAVA写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出。publicclassMultiThre... package thread;

//JAVA多线程编程。 用JAVA写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出。

public class MultiThread
{
private int j;
public static void main(String args[]) // 0,2 + 1,3 -
{
MultiThread tt=new MultiThread();
Inc inc=tt.new Inc();
Dec dec=tt.new Dec();

for(int i=0;i<2;i++)
{
Thread t=new Thread(inc);
t.start();
t=new Thread(dec);
t.start();
}
}

private synchronized void inc()
{
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}

private synchronized void dec()
{
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}

class Inc implements Runnable
{
public void run()
{
for(int i=0;i<10;i++)
{
inc();
}
}
}

class Dec implements Runnable
{
public void run()
{
for(int i=0;i<10;i++)
{
dec();
}
}
}
}

其中一组输出为
Thread-0-inc:1
Thread-0-inc:2
Thread-0-inc:3
Thread-0-inc:4
Thread-0-inc:5
Thread-0-inc:6
Thread-0-inc:7
Thread-0-inc:8
Thread-0-inc:9
Thread-0-inc:10
Thread-3-dec:9
Thread-3-dec:8
Thread-3-dec:7
Thread-3-dec:6
Thread-3-dec:5
Thread-3-dec:4
Thread-3-dec:3
Thread-3-dec:2
Thread-3-dec:1
Thread-2-inc:2
Thread-2-inc:3
Thread-2-inc:4
Thread-2-inc:5
Thread-2-inc:6
Thread-2-inc:7
Thread-2-inc:8
Thread-2-inc:9
Thread-2-inc:10
Thread-2-inc:11
Thread-1-dec:10
Thread-1-dec:9
Thread-1-dec:8
Thread-1-dec:7
Thread-1-dec:6
Thread-1-dec:5
Thread-1-dec:4
Thread-1-dec:3
Thread-1-dec:2
Thread-1-dec:1
Thread-3-dec:0

我试着输出了多组,求问为什么线程0,2号总是递增的,1,3号总是递减的,一定么?谁进行控制的?
展开
 我来答
限享宜9416
2014-08-13 · 超过60用户采纳过TA的回答
知道答主
回答量:111
采纳率:0%
帮助的人:145万
展开全部
你的设计只是一个单例模式,但是也是有问题
public static Singleton getInstance() {
if(singleton == null)
return new Singleton(); //始终没有给singleton赋值啊
else
return singleton;
}
可以改为return singleton=new Singleton();
这样也有个问题 --(昨天有点事,没有说完!)如果一个线程判断singleton为null还没有来的及赋值就被暂停,刚好另一个线程也运行此处给singleton赋值了,等前一个线程开始执行时就会再赋值一次。应该在加一个synchronized(this)加锁!有点复杂,可以定义singleton 时赋值getInstance直接返回这个值就可以了.
关于多处理器的问题,我个人觉的应该是由操作系统来负责调度,我们不用去关心,所有的程序时运行在java虚拟机上的,我们只关心虚拟机就可以了。
如果运行在多服务器上,那就应该需要的多虚拟机的同步了......这个我也没有研究过,爱莫能助
请采纳。
追问
你这个回答的是我的问题么(我比较有疑惑的是“为什么线程0,2号总是递增的,1,3号总是递减的,一定么?谁进行控制的?”)
我并没有问什么恶汉懒汉的单例模式呀 ?不是sychronized或wait notify控制下同步就好了么
绯攻0080977ef
2014-08-13 · TA获得超过284个赞
知道答主
回答量:291
采纳率:100%
帮助的人:72万
展开全部
你的设计只是一个单例模式,但是也是有问题
public static Singleton getInstance() {
if(singleton == null)
return new Singleton(); //始终没有给singleton赋值啊
else
return singleton;
}
可以改为return singleton=new Singleton();
这样也有个问题 --(昨天有点事,没有说完!)如果一个线程判断singleton为null还没有来的及赋值就被暂停,刚好另一个线程也运行此处给singleton赋值了,等前一个线程开始执行时就会再赋值一次。应该在加一个synchronized(this)加锁!有点复杂,可以定义singleton 时赋值getInstance直接返回这个值就可以了.
关于多处理器的问题,我个人觉的应该是由操作系统来负责调度,我们不用去关心,所有的程序时运行在java虚拟机上的,我们只关心虚拟机就可以了。
如果运行在多服务器上,那就应该需要的多虚拟机的同步了......这个我也没有研究过,爱莫能助
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友3b602ae8cb
2014-08-13 · 超过34用户采纳过TA的回答
知道答主
回答量:81
采纳率:100%
帮助的人:74.2万
展开全部

完全是随机的

这是我一次运行的结果: 可以说明你的问题 我用的是jdk 1.6 

本来有更凌乱的结果,一时贪心就再没遇到过。

我在你的代码中加了两个输出语句,好看清楚线程运行的情况

for(int i=0;i<2;i++)
{
Thread t=new Thread(inc);
t.start();
System.out.println("--------------");
t=new Thread(dec);
t.start();
System.out.println("--------------");
}
}

--------------

Thread-0-inc:1

Thread-0-inc:2

Thread-0-inc:3

Thread-0-inc:4

Thread-0-inc:5

Thread-0-inc:6

Thread-0-inc:7

Thread-0-inc:8

Thread-0-inc:9

Thread-0-inc:10

--------------

--------------

Thread-1-dec:9

Thread-1-dec:8

Thread-1-dec:7

Thread-1-dec:6

--------------

Thread-1-dec:5

Thread-1-dec:4

Thread-1-dec:3

Thread-1-dec:2

Thread-1-dec:1

Thread-1-dec:0

Thread-3-dec:-1

Thread-2-inc:0

Thread-2-inc:1

Thread-2-inc:2

Thread-2-inc:3

Thread-2-inc:4

Thread-2-inc:5

Thread-2-inc:6

Thread-2-inc:7

Thread-2-inc:8

Thread-2-inc:9

Thread-3-dec:8

Thread-3-dec:7

Thread-3-dec:6

Thread-3-dec:5

Thread-3-dec:4

Thread-3-dec:3

Thread-3-dec:2

Thread-3-dec:1

Thread-3-dec:0

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
心有魔债KB
2014-08-13 · TA获得超过158个赞
知道小有建树答主
回答量:206
采纳率:0%
帮助的人:158万
展开全部
这不是很明显么...你线程0和2那里用的是j++,所有会递增啊,而你线程1和3进入之前就进行j--,所有就递减了,这里是一次执行一个线程.另外的在等待.挂起.等这0线程执行完了,j的值为10,然后执行线程1,进行j--,值就开始递减咯.就是这个道理吧.自己多想下.我说的也不可能一定正确!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
心抱区区
推荐于2016-07-21 · TA获得超过152个赞
知道答主
回答量:208
采纳率:62%
帮助的人:24.2万
展开全部
for(int i=0;i<2;i++)
{
Thread t=new Thread(inc);
t.start();
t=new Thread(dec);
t.start();
}

这个循环决定的。当i=0,先后实例化了一个inc(即Thread-0)和一个dec(即Thread-1);当i=1,又实例化了一个inc(即Thread-2)和一个dec(即Thread-3);inc是递增,dec递减,就这样的
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式