public class MyClass {
public synchronized void myMethod() {
// some code here
try {
// wait for another thread to notify us
wait();
} catch (InterruptedException e) {
// handle the exception
}
// some more code here
}
}
多个线程对应一个对象,竞争获取一个对象锁,每个线程都是实现操作对象的必要载体。
object.wait(),让当前线程从拥有到放弃对象锁状态,相当于把对象锁的钥匙丢给其他人了,自己属于无钥匙状态而无法继续执行了,需要其他线程notify,用于线程之间的互动,多个线程围绕一个对象锁竞争。
Thread.sleep(),无论有没有获得锁, 线程暂停执行,锁状态不变,与其他线程没有关系。
sleep和wait都让出了CPU
block 属于非自愿等待,wait属于自愿等待
System.out.write() 定义里面使用了对象锁
首先说一下System.out, out是System类的一个静态变量, 它是一个PrintStream类型的对象. 一般而言, 这个打印型流对象对应到的是显示器输出, 所以它就是一个往命令行写东西的方法.
但是当你直接调用write方法的时候, 你写的字符还是驻留在内存里边 所以你还要调用
System.out.flush()来把东西写到命令行中.
public void write() {
synchronized(this) {
}
}