下看下面代码
大家猜猜日志应该是怎么样。
--aa--
--aa等等10秒--
---bb-
--bb等等10秒--
日志如上 不知道你猜到了吗
为什么会这样 因为加了一把类对象锁 SysThread.class
在类型内部可以理解有一个monitor方法。
把加锁的通知 告诉monitor ,等结束在告诉monitor
同理 如果
synchronized 放到方法 这个monitor对象 就是所在对象。
synchronized 放到静态方法 这个monitor对象 就是所在类对象。
这样大家可以理解了
如果在一类上 所有方法 synchronized 所有方法都是串行
而不是 每个方法是串行。
synchronized 看看加锁的恐怖了。还敢随便枷锁吗?
package demo.thread;
public class SysThread {
public static void main(String[] args) {
Thread aa =new Thread(new AA());
Thread bb =new Thread(new BB());
aa.start();
bb.start();
}
}
class AA implements Runnable
{
@Override
public void run() {
synchronized (SysThread.class) {
System.out.println("--aa--");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class BB implements Runnable
{
@Override
public void run() {
synchronized (SysThread.class) {
System.out.println("---bb-");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}