为什么我们调用start()方法时会执行ru()方法,为什么不能直接调用run()方法?
当调用start()方法时,会创建新的线程,并且执行run()方法中的代码;但是如果直接调用run()方法,不会创建新的线程,而是会将run()方法作为普通的方法调用执行。
在Java中notify()和notifyAll()有什么区别?
当一个线程进入wair()后,就必须等待其他线程notify/notifyAll,使用notifyAll可以唤醒所有处于wait状态的线程,使其重新进入就绪状态,会造成抢占资源;而notify只能唤醒一个,有时会造成信号丢失是程序异常。
在Java中wait和sleep方法的不同?
- wait在等待时会释放锁,常用于线程间的交互;
- sleep在等待时会一直持有锁,sleep通常用于暂停执行。
同步块和同步方法,有什么区别,哪个是更好的选择?
- 同步方法:即在声明方法是添加关键字synchronized即可。
- 同步块:在方法内部使用关键字synchronized修饰的大括号中的代码。
由此可见,同步块更好。因为同步方法会锁住整个对象,锁的范围比较大,而同步代码块范围较小;更符合开发调用的原则,只锁住需要共享的代码即可,可以更好的避免死锁。
为什么wait(),notify()和notifyAll()必须在同步方法或者同步块中调用?
- 当一个线程(当前正在运行且拥有该对象的锁)需要调用对象的wait()方法的时候,接着它会释放这个对象锁进入等待状态直到其他线程调用了这个对象上的notify()方法。
- 而当一个线程(当前正在运行的且拥有该对象的锁)需要调用对象的notify()方法时,该线程才会释放这个对象锁,以便其他在等待的线程就可以得到这个对象锁。
其实这些所有的方法都需要持有对象的锁,这样才能通过同步来实现,所以只能在同步方法或者同步块中被调用。