黑马程序员技术交流社区
标题:
在synchroized()代码块中的疑问
[打印本页]
作者:
H._张_♂
时间:
2014-3-23 21:38
标题:
在synchroized()代码块中的疑问
如果有同同一个对象作为synchroized(x)的参数,该参数x如果先在一个线程中被锁定,比如锁定后sleep(10000),在这段时间里,他在其他的线程中也作为synchroized(x)的参数时,这个线程能不能正常运行啊?
作者:
杨殿生
时间:
2014-3-23 21:41
不能正常运行 线程被冻结了 只能等到冻结时间1000ms 结束该同步才线程才能运行
作者:
leon_hm
时间:
2014-3-23 22:00
class TestThread
{
public static void main(String[] args)
{
new Thread(new RunClass(0)).start();
new Thread(new RunClass(1)).start();
System.out.println("Hello World!");
}
}
class RunClass implements Runnable
{
int flag=0;
public RunClass(int flag)
{
this.flag=flag;
}
public void run()
{
String str ="";
while(true)
{
if(flag==0)
{
Test.fun1(str);
}
else
{
Test.fun2(str);
}
}
}
}
class Test
{
public static void fun1(String str)
{
synchronized(str)
{
System.out.println("start Sleep");
try{Thread.sleep(1000);}catch(Exception e){}
System.out.println("end Sleep");
System.out.println("fun1:"+str);
}
}
public static void fun2(String str)
{
synchronized(str)
{
System.out.println("fun2:"+str);
}
}
}
复制代码
你看我上面这个代码的结果中
start Sleep
end Sleep
之间是没有其他值的。也就是调用fun1的代码时,线程1 sleep了,线程2也是不执行的。因为使用的是同一个x参数
作者:
多一点
时间:
2014-3-23 23:33
线程对象Sleep(10000)秒,但是他并不放弃CPU的执行权,锁还是在它的手里,所以其他同他一个锁的线程对象是不会获得CPU的执行权。
作者:
龙健
时间:
2014-3-24 19:57
按照我个人的理解是这样的,在线程进行sleep或者wait的时候,此时该线程是释放了执行资格个执行权的,但是它没有释放同步锁,此时,就算其他的线程得到了执行权,但是它没有得到同步锁,所以其他线程也是不能执行同步代码块或同步函数的,这就是毕老师所说的为什么线程在sleep结束或notify后会进入临时阻塞状态,当cpu切换到拥有同步锁的线程后,该线程就继续执行同步代码块或者同步函数。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2