面试整理2

1、Stringbulider和Stringbuffer的区别?
都继承子AbsturtStringbulider,但是Stringbulider的方法没有被syn修饰,StringBuffer的方法被syn修饰了
所以前者不是线程安全的,后者是线程安全的,在性能方面,前者单线程情况下性能更好

2、什么是线程安全
当多个线程访问同一个对象的时候,不需要进行额外的同步或者管理调度,并且调用这个对象的结果是正确的

3、如何保证线程安全

4、什么是锁?死锁
两个代码块互相需要彼此的锁

5、syn的实现原理是什么?
synchronized 属于独占式悲观锁,是通过 JVM 隐式实现的,synchronized 只允许同一时刻只有一个线程操作资源。

6、有了syn还要volatile干什么?
synchronize实现的锁本质上是一种阻塞锁,也就是说多个线程要排队访问同一个共享对象。
而volatile是Java虚拟机提供的一种轻量级同步机制,他是基于内存屏障实现的。说到底,他并不是锁,所以他不会有synchronized带来的阻塞和性能损耗的问题。

7、syn的锁优化是怎么回事?

8、知道JMM吗?
JVM内存模型:是一组规范、规则
原子性:就是说一个操作不能被打断,要么执行完要么不执行,也就是说在并发访问时是线程非安全的,要想保证原子性就得对访问该数据的地方进行同步操作,譬如 synchronized 等。
可见性:就是说当一个线程对共享变量做了修改后其他线程可以立即感知到该共享变量的改变,synchronized、Lock、final 都可以保证变量的可见性。
有序性:就是说 Java 内存模型中的指令重排不会影响单线程的执行顺序,但是会影响多线程并发执行的正确性

9、java的并发包了解吗?
Runnable、CallAble、TimeUnit、ConnurentHashMap、LinkBlockQueue

10、什么是copyonwrite

11、什么是AQS、CAS
cas就是比较和交换,有几个重要的值,新值A旧值B内存值V 如果b和v相等,那么就把b改成a,但是容易出现aba问题,就是改完后有改会原址了,就不会认为改变了,
解决方法增加一个版本号,每次修改版本号+1

12、CAS都知道,说一下乐观锁
乐观锁比较乐观,认为自己在操作资源的时候不会有其他线程来干扰,所以并不会锁住被操作对象,不会不让别的线程来接触它,同时,为了确保数据正确性,在更新之前,
会去对比在我修改数据期间,数据有没有被其他线程修改过:如果没被修改过,就说明真的只有我自己在操作,那我就可以正常的修改数据;如果发现数据和我一开始拿到的不一样了,
说明其他线程在这段时间内修改过数据,那说明我迟了一步,所以我会放弃这次修改,并选择报错、重试等策略。

13、乐观锁和悲观锁的区别?

14、数据库是如何实现乐观锁和悲观锁的

15、数据库锁有了解么?行级锁?表级锁?共享锁?排他锁?gap锁?next-key lock?

16、数据库锁和隔离级别有什么关系?

17、数据库锁和索引有什么关系?

18、什么是聚簇索引?非聚簇索引?最左前缀是什么?B+树索引?联合索引?回表?

19、分布式锁有了解吗?

20、Redis如何实现分布式锁、Zookeeper如何实现分布式锁

21、Redis和memcache区别是什么?

22、分布式系统怎么保证数据一致性?

23、啥是分布式事务?分布式事务方案?

24、来手写一个线程安全的单例吧?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值