黑马程序员技术交流社区
标题:
多线程中同步代码块执行问题
[打印本页]
作者:
山里孩子
时间:
2015-3-22 17:16
标题:
多线程中同步代码块执行问题
本帖最后由 山里孩子 于 2015-3-23 23:42 编辑
在这个代码中,正常输出是:
sum=100
sum=200
sum=300
sum=400
sum=500
sum=600
不知道哪里问题怎么输出是这个样子:
sum=200
sum=200
sum=400
sum=400
sum=600
sum=600
class Bank
{
private int sum ;
public void add(int number)
{
Object obj = new Object();
synchronized(obj)
{
sum = sum + number;
try
{
Thread.sleep(10);
}
catch (Exception e)
{
}
System.out.println("sum="+sum);
}
}
}
class User implements Runnable
{
Bank bank = new Bank();
public void run()
{
for ( int i=0 ; i<3 ; i++ )
{
bank.add(100);
}
}
}
class ThreadDemo3
{
public static void main(String[] args)
{
User u = new User();
Thread u1 = new Thread(u);
Thread u2 = new Thread(u);
u1.start();
u2.start();
}
}
复制代码
作者:
Searching
时间:
2015-3-22 17:42
你obj每次都new了一个对象,第7行你的同步锁就没办法锁住,第7行改成synchronized(Bank.class)就行了
作者:
山里孩子
时间:
2015-3-22 19:49
Searching 发表于 2015-3-22 17:42
你obj每次都new了一个对象,第7行你的同步锁就没办法锁住,第7行改成synchronized(Bank.class)就行了 ...
:lol谢谢喽. 非常感谢
作者:
关山明月
时间:
2015-3-22 21:51
每次运行add()方法后都新建了一个Object类的对象,用的不是同一个锁,可将 Object obj = new Object(); 放在方法外。
作者:
快乐ABC
时间:
2015-4-1 14:15
多线程同步有3个前提:
1.程序中有多个线程
2.多个线程操作共享数据
3.多个线程使用的是同一个锁
当出现多线程访问共享数据,出现问题时,就要考虑是以上的3个条件哪个或者哪几个没有满足。
这个程序中是使用的不是同一个锁,每次都重新new了一个锁对象,因此没有锁住。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2