Java程序员阿里面试题(二)

16 篇文章 0 订阅

java基础八题

1.string截取

  • split
    正则表达式切割,在所有的都完成之后返回整个数组
  • tokennizer
    分组返回
  • substring
    空间换时间,根据下标
  • charAT
    根据原始的String由char数组组成,所以最高效

2.spring事务

  • 事务隔离机制
    事务分为三个部分DataSource、TransactionManager和代理机制
    五个方式:
    1.每个bean单独代理;
    2.共享基类
    3.拦截器(beanid拦截)
    4.tx标签配置的拦截器
    5.全注解传播
    。PROPAGATION_ REQUIRED–支持当前事务,如果当前没有事务,就新建一个事
    务。这是最常见的选择。
    。PROPAGATION
    SUPPORTS–支持当前事务,如果当前没有事务,就以非事务
    方式执行。
    ) PROPAGATION_ MANDATORY–支持当前事务,如果当前没有事务,就抛出异
    o PROPAGATION
    REQUIRES_ NEW–新建事务,如果当前存在事务,把当前事务
    挂起。
    。PROPAGATION
    NOT_ SUPPORTED–以非事务方式执行操作,如果当前存在事
    务,就把当前事务挂起。
    。PROPAGATION
    NEVER–以非事务方式执行,如果当前存在事务,则抛出异
    常。

● 事务隔离级别
。DEFAULT使用数据库设置的隔离级别(默认),由DBA默认的设置来决定隔离
乐字节专海菠男刑高
高级架构培养
更多资料请加qq: 1811112688
。READ_ UNCOMMITTED会出现脏读、不可重复读、幻读(隔离级别最低,并发
性能高)
。READ
COMMITTED大多数主流数据库的默认事务等级,保证了一个事务不会读
到另一-个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多
数系统;会出现不可重复读、幻读问题(锁定正在读取的行)
。REPEATABLE_ READ保证了一个事务不会修改已经由另一个事务读取但未提交
(回滚)的数据。避免了“脏读取”和“不可重复读取’的情况,但是带来了更多的
性能损失;会出幻读(锁定所读取的所有行)
。SERIALIZABLE最严格的级别,事务串行执行,资源消耗最大;保证所有的情况不
会发生(锁表)

3.HashMap循环链表形成

●循环链表形成
由于非线程安全在扩容的时候,多个线程操作引起:
hashMap在达到扩容因子的时候会扩容(length*0.75) 一
扩大一倍,扩容时会重新计算在数组中得位置
当第–个线程开始扩容的时候,读取了hash值对应链表顺序读取复制到新的hash位置的
链头;原来的顺序是A、B,复制过去后的顺序就是B、A;对线程- -来说A的next是
null,B的next是A;
这时第二个线程进来,读取的可能就是A的next是B,这样就造成了环形链表死循环。
●避免
安全线程ConcurrentHashMap。
●其他问题
犹豫不是安全线程,不仅仅是会环形链表,还有可能会造成数据覆盖丢失。

4.Synchronized与Lock

●ReentrantL ock和Synchronized
ReentrantL ock拥有Synchronized相同的并发性和内存语义,此外还多了锁投票,定
时锁等候和中断锁等候
线程A和B都要获取对象O的锁定,假设A获取了对象0锁,B将等待A释放对O的锁定,
如果使用synchronized,如果A不释放,B将- -直等下去,不能被中断
如果使用Reentrantl ock,如果A不释放,可以使B在等待了足够长的时间以后,中断
等待,而干别的事情
●ReentrantLock
ReentrantLock获取锁定与三种方式:
a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状
悉置到瘐敢瓒培养
更多资料请加qq: 1811112688
b) tryLock(),如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
c)tryL ock(long timeout,TimeUnit unit),如果获取 了锁定立即返回true,如果别的线
程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回
true,如果等待超时,返回false ;
d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠
状态,直到或者锁定,或者当前线程被别的线程中断
●区别
。synchronized:
在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是 很合
适的。原因在于,编译程序通常会尽可能的进行优化synchronized,另外可读性
非常好,不管用没用过5.0多线程包的程序员都能理解。
o ReentrantL ock:
ReentrantL ock提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步 是不能Interrupt的)等。在资源竞争不激烈的情形
下,性能稍微比synchronized差点点。但是当同步非常激烈的时候,
synchronized的性能一下 子能下降好几千倍。而ReentrantLock确还能维持常态。
●参考博客
https://blog.csdn.net/u012403290/article/details/64910926?locationNum=11&fps=1

5.ThreadLocal以及死锁分析

hreadL ocal为每个线程维护一个本地变量。
采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每
个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。
ThreadL ocal类中维护一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对
象,而值为对应线程的变量副本。
●参考博客
https://www.cnblogs.com/xzwblog/p/7227509.html

如果想要更新更全的java面试题可以加企鹅群::①零⑧零③⑤⑤②⑨②
有全套学习资料免费领取,和志同道合的小伙伴一起学习!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值