2021-01-28

1 篇文章 0 订阅
1 篇文章 0 订阅

1.什么是线程安全:
官方的定义:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。

面试官接着问:
2.如何保证线程安全:
我回答了以下两个:
1、Synchronized:同步关键字,自动锁,悲观锁
synchronized锁住的是对象,可以锁类里面的obj对象,可以锁住this类对象,可以锁住该类的class对象(静态方法或者块的锁)
注意点:虽然加synchronized关键字,可以让我们的线程变得安全,但是我们在用的时候,也要注意缩小synchronized的使用范围,如果随意使用时很影响程序的性能,别的对象想拿到锁,结果你没用锁还一直把锁占用,这样就有点浪费资源。即锁细化,此处可以引申一下锁的粗化与细化。
2、Lock:手动锁,其子类为RentrantLock,RentrantLock为独占锁,可分为公平锁和非公平锁。
接着介绍了常用的方法:
lock()方法,上锁
unlock()方法:解锁吗,通常加在finally块中,
trylock()方法,boolean型,尝试上锁,不会造成阻塞,其实tryLock()是可以进行设置等待的相应时间的。
这里可以引申一下公平锁和非公平锁。

3.接着他问了下我synchronized的底层实现,我当时懵了,一个关键字的底层实现确实没怎么注意过。

4.接着又问synchronized是可重入锁吗,什么是可重入锁?
synchronized是可重入锁,可重入的意思类似于递归。
所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。
synchronized 和 ReentrantLock 都是可重入锁。
可重入锁的意义在于防止死锁。
实现原理是通过为每个锁关联一个请求计数器和一个占有它的线程。当计数为0时,认为锁是未被占有的;线程请求一个未被占有的锁时,JVM将记录锁的占有者,并且将请求计数器置为1 。
如果同一个线程再次请求这个锁,计数将递增;
每次占用线程退出同步块,计数器值将递减。直到计数器为0,锁被释放。

5.集合方面:list哪些是线程安全的,arraylist为什么不是线程安全的?Arraylist什么时候进行第一次扩容?
默认是:arraylist默认初始容量为0,当添加第一个对象时,扩容为10.
几种list的区别就不在叙述。
arraylist举例说明为何不是线程安全:在两个线程对arraylist进行add()时,开始size()==0,A线程正在进行add(),在还没有完成之前,B线程也对arraylist进行add(),此时,size()就被加了两次size()==2,而arraylist中,只插入了一个数据,其中一个被覆盖掉了。如果是多个线程呢?

6、说一说Hashmap的实现
先分java7前后,java7以前数组+链表,通过对象的hashcode()找数组下标,equals()找链表中的具体位置.
Java7以后,数组+链表+红黑树,在java7的基础上,如果链表长度大于阈值
8,则自动转化为红黑树,理由:链表遍历效率O(n),红黑树遍历效率O(logN)
数组2^n长度存在,2倍大小扩容,负载因子是0.75,(注意:并非超过给定大小的075%就扩容,是根据hashmap中数组的实际长度来计算是否扩容的)
Hashmap允许key,value为null吗?
Key:只能存在一个null,多的覆盖
Value:可以有多个null值
引申:hashtable不允许有null的key值,接着可以讲一讲hashtable与hashmap,currenthashmap的区别

8.说一说Currenthashmap的实现
采取分段锁,用到sagment,默认可以最大并发线程为16个。详细另行查阅
i/o部分:一个编程题,大致意思,就是对一个文件夹的遍历,找出里面所有的java文件。
9.数据库方面:给出条件,编写sql,大致是求和,分组,排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值