您的位置:首页 > 职场人生

多线程的面试题解答(二)

2017-12-27 17:32 183 查看
1.什么是可重入锁ReentrantLock

         线程可以进入任何一个它已经拥有锁同步的代码块。同一个线程,外层函数获取锁后,内层仍然有获取该锁的代码。ReentrantLock还提供了中断锁和定时锁等待。

2.当一个线程进入某个对象的一个synchronized的实例方法后,其它线程是否可进入此对象的其它方法?

          如果该对象其他方法没有加synchronized关键字,可以进入

          如果该方法调用了wait方法,则可以进入

          如果其它方法没有synchronized同时该方法没有调用wait,则不可以进入

          如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是该对象。

          如下:

/**
* @author: krauser
* @date: Create in 下午5:39 2017/12/27
* @Description:
*/
public class TestSyn {

static class test {

public static synchronized void add() throws InterruptedException {
System.out.println("add..");
TimeUnit.SECONDS.sleep(3);
}

public static synchronized void get() throws InterruptedException {
System.out.println("get..");
}

}

public static void main(String[] args) throws InterruptedException {
//test testSyn = new test();
new Thread(() -> {
try {
test.add();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
test.get();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
TimeUnit.SECONDS.sleep(10);
}

}


3.synchronized和java.util.concurrent.locks.Lock的异同

性能差不多,都是实现线程的之间的同步。

Lock可以主动中断锁,还提供了一个condition对象

4.乐观锁和悲观锁

1.悲观锁:即很悲观,每次拿数据的时候都觉得数据会被人更改,所以拿数据的时候就把这条记录锁掉,这样别人就没法改这条数据了,一直到你的锁释放。
2.乐观锁:即很乐观,查询数据的时候总觉得不会有人更改数据,等到更新的时候再判断这个数据有没有被人更改,有人更改了则本次更新失败。

悲观锁用MUTEX实现,互斥锁(排他锁)
乐观锁用CAS实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: