1.sleep()方法与wait()方法有什么区别?
sleep()方法是使线程暂停一段时间,wait()方法也是使线程暂停执行。
(1.)原理不同。sleep()方法是Thread类的静态方法,是线程用来控制自身流程,它会使此线程暂停一段时间执行,二八执行机会让给其他线程,等时间一到,此线程会自动“苏醒”。而wait()方法是Object类的方法,用于线程间的通信,这个方法会使当前拥有该对象锁的进程等待,直到其他线程调用notify()时才“醒”来。
(2.)对锁的处理机制不一样。sleep()方法主要是让线程暂停执行一段时间,时间一到就恢复,不涉及线程间的通信。所以sleep()不会释放锁。而调用wait()方法,线程会释放锁,可以使线程所在对象中其他synchronized数据可以被其他线程调用。
(3.)使用的区域不一样。sleep()方法必须捕获异常。可以用在任何地方。wait()方法必须放在同步控制方法或者同步语句块中。
由于sleep()不会释放锁,容易导致死锁。
引申:sleep()方法与yield()方法有什么区别?
(1.)sleep()方法给其他线程运行机会时不考虑线程的优先级,所以优先级低的也有相同的机会。而yield()方法只会给相同优先级或优先级更高的线程运行机会。
(2.)线程执行sleep()方法后悔进入阻塞状态。执行sleep()方法的线程在指定的时间不会被执行。而yield()方法只是使当前线程回到可执行状态,所哟执行yield()方法可能在进入到可执行状态会被马上执行。
(3.)sleep()方法抛出InterruptedException,而yield()方法不会抛出异常。
(4.)sleep()方法比yield()方法具有更好的移植性。
2.synchronized和lock
在java中有两种机制实现对资源共享的同步。synchronized使用Object对象本身的notify、wait、notityAll方法。lock使用Condition进行线程之间的通信。
(1.)用法不一样。在需要同步的对象中加入synchronized控制,synchronized既可以加在方法上们也可以加在特定的代码块中,括号中表示索要锁的对象。lock需要显示的指定其实位置和终止位置。synchronized是交给JVM执行的,lock的锁定是通过代码实现的,它比synchronized更精确的线程语义。
(2.)性能不一样。在JDK5中增加了lock接口的实现类ReentrantLock。它不仅拥有和synchronized相同的并发性和内存语义,还多了定时锁、中断锁等机制。在资源竞争不是很激烈的时候,synchronized的性能要优于ReetrantLcok。反之,相反。
(3.)锁机制不一样。synchronized获得锁和释放锁的方式都是在块结构中,当获取多个锁时,必须以相反的顺序释放,并且是自动解锁,不会因为出了异常而导致所没有被释放从而导致死锁。lock需要手动释放,并且必须在finally块中释放,否则会导致死锁。tryLock()方法可以采用非阻塞的方式去获取锁。
当一个线程进入一个对象的synchronized()方法后,其他线程对象是否可以访问此对象其他方法。
3.什么是守护线程
java提供了两种线程:守护线程和用户线程。守护进程又被称为“服务进程”“后台进程”,是指在程序运行时在后台提供一种通用服务的线程,这种线程并不是程序中不可或缺的部分。用户进程和守护进程几乎一样,唯一不同之处就在于如果用户线程已经全部退出运行,只剩下守护线程的存在,JVM也就退出了。因为当所有非守护线程结束时。没有了被守护者,守护线程也就没事可做,也就没有继续运行程序的必要。只要有任何非守护线程还在运行,程序就不会终止。在java中,守护线程一般具有较低的优先级。