写在前面
当自己真正开始梳理以往学过的知识,会发现很多点有遗忘或者当时了解的就不是很透彻。可以参考相关学过的课程,和别人的简历对自己的技术栈进行一个梳理
后面反思了一下
后面插入一条主线,其实以下问题是基于JUC开发的相关问题。为什么以前自己不够了解这些问题,或者说了解完容易忘记,因为做的很多项目都不是并发的,没用线程,也没用事务、更没用多事务,多人同时登陆。所以姑且这块叫做**JUC面试部分吧!**而且我觉得再小的公司也得有并发的情况啊,所以我觉得这块还是挺重要的,后期想真正的落实到项目中。
1.这一块的理解今天又加深了一下(不知正确与否),其实在实际生产中,还是主要在dao层这块,在数据库这块。http协议以及服务器的架构,他们本身就支持很好的隔离机制,只有到我们自己操作crud到数据库或者缓存中的时候,那时候我们的多线程之间对同一块内存或者同一行数据进行操作的时候,要格外小心。
JAVA–线程相关考点
-
理解这部分的话,第一要理解资源的概念,比如说i现在这个整形,在并发下就是一个资源,有可能两个线程同时读到了他,但是而且要进行相应的操作。这是资源的理解,像同步代码块,同步方法都是java里面对并发下资源的控制。
-
第二理解并发的话,重点理解和观察出哪里是非原子性操作,什么叫非原子性操作。就是说白了,我这个操作,我执行的时候,不可能切出去,别的线程不可能打断。就一步就能完事的操作。
-
你去搜,有基本三大类,我自己是不太熟悉。我的经验就是一旦是两行代码了,尤其if这种基本不是了,两行你就有情况先判断然后等着,又来一个判断,然后你去操作,他操作的时候很明显就把你的操作覆盖掉了(我说的是cpu轮询的时候)。
-
再一个++这种操作,或者i+=n这种操作(这个操作类型,在hashmap扩容的时候就有,现有长度等于原长度+扩容长度)–所以hashmap不安全
-
补充的话 还有,除了 long double 基本类型的复制,就直接一个=号这种;引用这是原子性的操作,还有一个原子包里面都是原子性的,所以说运算来说非原子性的概率很大
线程的五种状态 -
新建就你new了什么的 就绪
-
start执行了以后就就绪了–sleep与wait()的notify()也是就绪状态等着操作系统来找你
-
run不用说跑起来了
-
阻塞状态,阻塞、就绪、运行三者之间一个三角。阻塞之后只能就绪,不能直接运行。那么说sleep和wait都是让线程进入阻塞态
-
死亡状态
1.说下Sleep和wait的区别
sleep()方法
-
sleep方法属于线程类。
-
sleep的线程,首先不一定是调用了同步锁。
-
如果调用了同步锁的话,它不会释放掉同步锁。
-
他仅仅让出cpu,但是锁住的相关对象其他线程无法调用。
-
当sleep时间到的时候,会自动重新抢夺cpu资源,但是不一定能够抢夺到。
wait()方法 -
wait方法属于object类,同时notify()也是。
-
这两个哥们配合使用,表示线程挂起与恢复。
-
此时线程一定调用同步锁,并且他会释放掉同步锁,继续回到线程池中等待。
-
等待其他方法调用notifiy()来通知他参与到cpu的竞争(此时解除阻塞状态,但是要看是否wait()方法设置了超时时间,如果设置了超时时间,不用等到其他进程使用notifiy方法,一样会解除阻塞),但是不是notifiy()方法一调用他就能拿到cpu资源,此时还是要等待其他方法调用wait(),这样资源才会被释放掉。
-
相比较sleep方法可以在任意位置执行,wait只能在同步代码中执行。
-
wait方法使用时要捕获异常。
相同点 都可以被interrupted方法中断
synchronized与Lock区别
首先synchronized是java的一个关键字,而Lock是一个接口
关键字会有锁升级等过程,这个以后再聊,关键字不会造成死锁,接口会造成死锁,所以说你在finally里面必须给他解开、释放掉
。关键字会释放掉自己手里的资源,分为两种,要是我拿到这个锁,我会执行完,就放。我要有异常,jvm会帮关键字释放锁。
但是Lock可以通知线程相应终止等待资源,但是关键字不会他会老老实实让其他线程等着,等着我获得这个锁。
关键字适用于少量同步的时候,接口适用于大量同步的时候。因为接口可以实现读写分离,一块读,一块写。简单来说接口比较灵活,关键字比较单一,竞争不激烈的时候使用关键字管理就行。
JAVA–字符串常见考点
聊聊String、StringBuffer、StringBuilder
stirng
- 1.首先来讲,字符串的话底层是字符数组。
2.string本身的数组是被final修饰的,所以打死他他也不能变,所以我们对string做的任何操作都不会改变原来的字符串。
3.另外string的