java 多线程问题
//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号总是递减的,一定么?谁进行控制的? 展开
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控制下同步就好了么
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虚拟机上的,我们只关心虚拟机就可以了。
如果运行在多服务器上,那就应该需要的多虚拟机的同步了......这个我也没有研究过,爱莫能助
完全是随机的
这是我一次运行的结果: 可以说明你的问题 我用的是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
{
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递减,就这样的