线程互斥
线程互斥靠synchronized关键字来实现。
synchronized(钥匙)
{互斥区代码}
只有拿到了钥匙才可以进入互斥区代码。
任何对象都可以作为钥匙,不过为了让代码看起来更有意义,一般就将互斥资源作为钥匙。
线程同步
线程同步靠Object类的wait/notify函数来实现,这两个函数只能出现在synchronized的花括号内。
钥匙.wait()使得线程放弃钥匙,然后睡眠等着钥匙,没有其他线程叫它的话它是不会醒的。当然,睡眠时是不会抢钥匙的,所以永远也得不到钥匙。
如果是钥匙.wait(ms)或钥匙.wait(ms,ns)的话,就算没有其它线程叫,时间到了也会自己醒来。
钥匙.notify()使得一个睡眠等着钥匙的线程醒来,以便它可以去抢钥匙然后继续执行剩余的互斥区代码。钥匙.notifyAll()可以叫醒所有睡眠等待钥匙的线程。