黑马程序员技术交流社区
标题:
为什么加了锁之后还是出现安全问题呢
[打印本页]
作者:
anywayDo
时间:
2015-5-18 14:22
标题:
为什么加了锁之后还是出现安全问题呢
class Demo implements Runnable
{
private String name;
private static int t=100;
Demo(String name)
{
this.name=name;
}
Object obj=new Object();
public void run()
{
synchronized(obj)
{
while(t>0)
{
try
{
Thread.sleep(20);
}
catch (Exception e)
{
}
System.out.println(Thread.currentThread().getName()+"...run"+t--);
}
}
}
}
class RunnableDemo
{
public static void main(String[] args)
{
Thread t1=new Thread(new Demo("d1"));
Thread t2=new Thread(new Demo("d2"));
Thread t3=new Thread(new Demo("d3"));
Thread t4=new Thread(new Demo("d4"));
t1.start();
t2.start();
t3.start();
t4.start();
}
}
复制代码
对多线程操作的部分加了锁,为什么还是出现打印结果是负数的情况呢?是循环的问题么?
作者:
zq19910303
时间:
2015-5-18 19:16
本帖最后由 zq19910303 于 2015-5-19 22:18 编辑
这是因为你锁里面的代码导致的,当线程t1运行到锁里面时不将while循环结束,其他的线程是进不了锁的,而循环结束了,其他的线程就不必运行了,所以你应该将13行到27行的代码改为
while(ture)
{
synchronized(Obj)
{
if (t>0)
{
try
{
Thread.sleep(20);
}
catch (Exception e)
{
}
System.out.println(Thread.currentThread().getName()+"...run"+t--);
}
}
}
复制代码
这样就避免了一个线程在锁里面不循环结束就不解除锁的状态了
作者:
anywayDo
时间:
2015-5-19 21:16
zq19910303 发表于 2015-5-18 19:16
这是因为你锁里面的代码导致的,当线程t1运行到锁里面时不将while循环结束,其他的线程是进不了锁的,而循 ...
呀呀。。大神!!厉害。。我好像懂了。。
作者:
我干阿衰
时间:
2015-5-19 21:25
秒懂................
作者:
牛兴亮
时间:
2015-5-19 21:39
zq19910303 发表于 2015-5-18 19:16
这是因为你锁里面的代码导致的,当线程t1运行到锁里面时不将while循环结束,其他的线程是进不了锁的,而循 ...
:L,多个线程拿的不是同一个锁好嘛
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2