13.多线程:sleep和wait去别:执行权:正在被cpu处理;执行资格:可以被cpu处理,在处理队列中排队
wait:可指定等待的时间,不指定须由notify或notifyAll唤醒。
线程会释放执行权,且释放锁。
sleep:必须制定睡眠的时间,时间到了自动处于临时(阻塞)状态。
即使睡眠了,仍持有锁,释放执行权,cpu可以处理其他线程。
同步的好处:解决了线程的安全问题
同步的弊端:相对降低了效率,同步都会判断同步锁
同步的前提:同步中必须有多个线程并使用同一个锁
同步函数:用synchronized作为函数的修饰符,对需要的功能用函数封装后同步。同步函数使用的锁是this。
同步函数和同步代码块的去别:同步函数的锁是固定的this,同步代码块的锁是任意对象。建议使用同步代码块。静态的同步函数使用的锁是:该函数所属字节码文件对象,可以使用getClass方法获取,也可以使用当前类名.class表示
死锁:1.同步的嵌套可能导致死锁。
jdk1.5以后将同步和锁封装成了对象。并将操作锁的隐式方式定义到了该对象中,将隐式动作变成了显示动作。
Lock接口:出现替代了同步代码块或者同步函数。将同步的隐式锁操作变成现实锁操作。
同时更为灵活。可以一个锁上加上多组监视器。
lock():获取锁。
unlock():释放锁,通常需要定义finally代码块中。
等待/唤醒机制涉及的方法:
1,wait():让线程处于冻结状态,被wait的线程会被存储到线程池中。
2,notify():唤醒线程池中一个线程(任意).
3,notifyAll():唤醒线程池中的所有线程。
这些方法都必须定义在同步中。因为这些方法是用于操作线程状态的方法。必须要明确到底操作的是哪个锁上的线程。
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------