class Bank
{
private int sum;
public void add(int num)
{
sum = sum + num;
System.out.println("sum="+sum);
}
}
class Cus implements Runnable
{
Bank b = new Bank();
public void run()
{
for(int x=0; x<3; x++)
{
b.add(100);
}
}
}
class BankDemo
{
public static void main(String[] args)
{
Cus c = new Cus();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}
运行结果如下:
class Bank
{
private int sum;
//Object obj = new Object();
public synchronized void add(int n) //用synchronized同步代码块处理
{
//synchronized(obj)
//{
sum = sum + n;
try{Thread.sleep(10);}catch(Exception e){}///这边加上看看。
System.out.println("sum="+sum);
//}
}
}
class Cus implements Runnable
{
private Bank b = new Bank();
public void run()
{
for(int x=0; x<3; x++)
{
b.add(100);
}
}
}
class BankDemo
{
public static void main(String[] args)
{
Cus c = new Cus();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
} 作者: 全海波 时间: 2012-7-22 10:24 本帖最后由 全海波 于 2012-7-22 13:11 编辑
class Bank
{
private int sum;
public void add(int num)
{
//第六步:每个储户的钱开始累加
sum = sum + num;
/*
第七步:这步是你打印出的结果的关键问题所在,也是原理所在!!!!
在这里线程执行到这步的时候,线程“1已经运算了一次,sum的值这时为100,
但在此时”线程“1”往下执行的时候有可能在这里悬挂,也就是说
该线程有可能进入阻塞状态(临时状态),等线程“1”进入临时状态的时候,
这个计算结果还没能够打印,线程“2”这时候也进入了,计算并累加上一次的结果,
计算完后,打印结果,这时候,线程“1”重新获得了执行权,开始执行打印结果,结果发现
sum的值已经从原来的100变成要现在要打印200了,这就是为什么出现这种结果了
*/
System.out.println("sum="+sum);
}
}
class Cus implements Runnable
{
Bank b = new Bank();
//第四步:线程1,2分别进入循环阶段,储户开始往Bank存钱
public void run()
{
for(int x=0; x<3; x++)
{
//第五步:调用add方法,每个储户每次存入一百元
b.add(100);
}
}
}
class BankDemo
{
public static void main(String[] args)
{
//第一步:主线程进入,创建Cus对象
Cus c = new Cus();
//第二步:接下来创建线程1 ,2,此时线程被创建,但是没有执行
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
//第三步:线程1,2开始执行,调用run方法
t1.start();
t2.start();
}
}
复制代码
希望可以解决你的疑惑,您的疑惑被解决,是我最大的快乐!作者: 郭凯敏 时间: 2012-7-22 14:43
线程的同步问题:在run方法加上关键字synchronized就可以了,试试下面的代码撒,希望可以解决你的疑问
class Bank
{
private int sum;
public void add(int num)
{
sum = sum + num;
System.out.println("sum="+sum);
}
}
class Cus implements Runnable
{
Bank b = new Bank();
public synchronized void run()//控制线程的进度,一个执行完在一个,这样就会稳定的输出了
{
for(int x=0; x<3; x++)
{
b.add(100);
}
}
}
class BankDemo
{
public static void main(String[] args)
{
Cus c = new Cus();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}
-----------------------------------------------------------------------------------------------------华丽的分割线----------------------------------------------------------------------------------------------------------------------------------------------------
也可以使用同步代码块完成:
class Bank {
private int sum;
public void add(int num) {
sum = sum + num;
System.out.println("sum=" + sum);
}
}
class Cus implements Runnable {
Bank b = new Bank();
public void run()
{
synchronized (this) {
for (int x = 0; x < 3; x++) {
b.add(100);
}
}
}
}
class BankDemo {
public static void main(String[] args) {
Cus c = new Cus();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}
结果:
作者: 刘海源 时间: 2012-7-22 21:29
class Bank
{
private int sum;
public synchronized void add(int num)//这里应该加同步,不加同步的话有可能发生安全问题
{ //当线程执行到sum = sum + num;的时候有可能cup切换到
//另一个线程去执行,并没有来的急打印出来,所以会出现你所看到的问题
sum = sum + num; //加上同步之后就会执行完了之后下一个线程才能执行,就解决了问题
System.out.println("sum="+sum);
}
}
class Cus implements Runnable
{
Bank b = new Bank();
public void run()
{
for(int x=0; x<3; x++)
{
b.add(100);
}
}
}
class BankDemo
{
public static void main(String[] args)
{
Cus c = new Cus();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}