一.乐观锁和悲观锁
悲观锁:即线程获得的是独占锁,独占锁意味着其他线程只能依靠阻塞来等待线程释放锁。Java里面的同步原语synchronized关键字的实现采用的也是悲观锁。
乐观锁:每次不加锁而是假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁的实现机制是CAS操作(Compare and Swap 比较并交换)。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。
二. get和post的区别
(1)get被强制服务器支持。
(2)get请求不能代替post请求发送大量数据(因为浏览器对URL的长度有限制)。
(3)get请求发送的数据小,是幂等的,但get请求是不安全的。
(4)post请求不能被缓存,post请求相对于get请求是安全的,比get安全性高。
(5)以下情况时,请使用post请求:
a.无法使用缓存文件
b.向服务器发送大量数据
c.发送包含未知字符的用户输入时,post比get稳定性更可靠。
三. wait和sleep的区别
(1)wait是Object类的方法,sleep是Thread类的方法。
(2)sleep()方法是Thread类放入静态方法,调用此方法会让当前线程暂停执行指令的时间,将CPU让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复,线程回到就绪状态。
(3)wait是Object类的方法,调用对象的wait()方法,会使线程释放对象的锁,进入等待池,只有调用对象的notify()方法或notifyAll()方法时,才能唤醒等待池中的线程,当线程重新获得对象锁时就可以回到就绪状态。
四.死锁
产生死锁的必要条件:
互斥条件,不可抢占条件,占有且等待条件,循环等待条件。
死锁预防:
打破互斥条件:允许进程同时访问某些资源。
打破不可抢占条件:允许进程强行从占有者那里夺取某些资源。
打破占有且等待条件:可以执行资源预先分配策略。
打破循环等待条件:实行资源有序分配策略。
五.进程间的通信
进程间通信方式:管道,命名管道,信号,信号量,消息队列,共享内存,内存映射,套接口。