下面关于Spring的说法中错误的是
Spring是一系列轻量级Java EE框架的集合
Spring中包含一个“依赖注入”模式的实现
使用Spring可以实现声明式事务
Spring提供了AOP方式的日志系统
正确答案: D
Spring框架中的核心思想包括什么?
依赖注入
控制反转
面向对象
面向切面
正确答案: A B D
在Spring框架中获取连接池可以有哪些方式?
DBCP数据源
C3P0数据源
Spring的数据源实现类(DriverManagerDataSource)
获取JNDI数据源`
正确答案: A B C D
spring的PROPAGATION_REQUIRES_NEW事务,下面哪些说法是正确的?
内部事务回滚会导致外部事务回滚
内部事务回滚了,外部事务仍然可以提交
外部事务回滚了,内部事务也跟着回滚
外部事务回滚了,内部事务仍然可以提交
正确答案: B
Servlet接口的方法有哪些?
doGet方法
doPost方法
init方法
forward方法
正确答案: C
多个线程可同时操作一个数据,为了保证该数据的准确性,可将操作该数据的部分改为:
只写
只读
异步
同步
正确答案: D
Inter-process communication (IPC) is the transfer of data among processes. Which of the following is NOT a typical programming technique for IPC?
mutex
pipe
socket
message queue
正确答案: A
锁是用来进行进程或线程间同步的,不是用来进程间通信的。IPC包括管道,命名管道,共享内存,LPC,socket,消息队列,rmi等等方式。
无锁化编程有哪些常见方法?
针对计数器,可以使用原子加
只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)
RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法
CAS(Compare-and-Swap),如无锁栈,无锁队列等待
正确答案: A B C D
A 原子操作是汇编级别支持的指令lock xadd,如c++中的interlockIncrement,java中有AutomicInteger都是对其的封装。简单变量的线程同步用这种方式效率最高。
B 多个生产者和多个消费者,一样可以做到免锁访问,但要使用原子操作。这里的意思应该是不用原子操作级别的免锁,理由也很简单,生产者和消费者需要修改的位置是分开的(生产者加在尾部,消费者从头部消费),且只有一个读一个写,不会发生冲突。所以只有一点需要关注,就是尾部指针和头部指针每次需要比较以避免生产溢出或者过度消费,而简单变量的读操作都是原子的。
C 类似的一个概念叫CopyOnWrite,复制一份,修改完后,替换回去时只需替换一个指针或引用,锁住的粒度非常小。但有可能还有线程持有的是旧的指针,因此旧的副本需要延迟释放。
D 汇编级别支持的指令cmpxchg,锁定内存地址,比较地址中修改前的内容是否与修改时的值一致,如果不一致就说明有其他线程改动,需要重新做。如,内存地址0x123456中原来存放的是10101010,但CPU执行到cmpxchg指令时,发现内存中变成了11111111,那么就认为其他线程已经修改了这个地址的值,需要重新读取0x123456中的值11111111,再做一次cmpxchg,如果这次发现内存中仍然是11111111,那么cmpxchg就会把新的值写入到0x123456中去。这里面有个ABA问题,就是有线程改了2次从11111111 -> 10111111 -> 11111111,那么CAS操作是识别不了的,需要从业务层去避免,如果直接在0x123456再放一个地址值,而地址值如果不先释放再重新申请内存,就不会出现重复值。
数据库以及线程发生死锁的原理是什么?
资源分配不当
进程运行推进的顺序不合适
系统资源不足
进程过多
正确答案: A B C
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
产生死锁的四个必要条件:
(1)互斥条件:一个资源每次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁:
死锁的预防是通过破坏产生条件来阻止死锁的产生,但这种方法破坏了系统的并行性和并发性。
死锁产生的前三个条件是死锁产生的必要条件,也就是说要产生死锁必须具备的条件,而不是存在这3个条件就一定产生死锁,那么只要在逻辑上回避了第四个条件就可以避免死锁。
避免死锁采用的是允许前三个条件存在,但通过合理的资源分配算法来确保永远不会形成环形等待的封闭进程链,从而避免死锁。该方法支持多个进程的并行执行,为了避免死锁,系统动态的确定是否分配一个资源给请求的进程。
预防死锁:具体的做法是破坏产生死锁的四个必要条件之一。
银行家算法:该算法需要检查申请者对各类资源的最大需求量,如果现存的各类资源可以满足当前它对各类资源的最大需求量时,就满足当前的申请。换言之,仅当申请者可以在一定时间内无条件归还它所申请的全部资源时,才能把资源分配给它。这种算法的主要问题是,要求每个进程必须先知道资源的最大需求量,而且在系统的运行过程中,考察每个进程对各类资源的申请需花费较多的时间。另外,这一算法本身也有些保守,因为它总是考虑最坏可能的情况。
JDK提供的用于并发编程的同步器有哪些?
Semaphore
CyclicBarrier
CountDownLatch
Counter
正确答案: A B C
同步器是一些使线程能够等待另一个线程的对象,允许它们协调动作。最常用的同步器是CountDownLatch和Semaphore,不常用的是Barrier 和Exchanger
以下说法正确的是:
在并行程度中,当两个并行的线程,在没有任何约束的情况下,访问一个共享变量或者共享对象的一个域,而且至少要有一个操作是写操作,就可能发生数据竞争错误。
原语Compare-and-swap(CAS)是实现无锁数据结构的通用原语。
获得内部锁的唯一途径是:进入这个内部锁保护的同步块或方法。
volatile变量具有synchronized的可见性特性,但是不具备原子特性。
减小竞争发生可能性的有效方式是尽可能缩短把持锁的时间
正确答案: A B C D E
A: 来自Thinking in java:如果你正在写一个变量,它可能接下在将被另一个线程读取,或者正在读取上一个已经被另一个线程写过的变量,那么你必须应用同步,并且,读写线程都必须用相同的监视器锁同步。--由此可以想到,如果多个线程都只读数据,则不会造成竞争错误,因为不会出现读脏数据或者数据不同步问题。
B. 无锁化编程常用方式之一
C. 当线程企图访问临界资源时,先会查看该临界资源当前是否已被加锁,如果没有被加锁,则对该临界资源加锁,并进入该同步块或方法,加锁后,其他线程也就无法访问该临界资源了。所以判定获取了一个内部锁的标准为:进入该同步区域
D. 保证可见性,调用volatile变量时,使用前都会刷新该变量,保证变量的值为最新的。不保证互斥性,所以不具备原子特性
E. 把持锁的时间短了,等待锁的时间也就短了,竞争可能性变小
竞选条件(race condition)的情况下,两线程执行如下代码段,其中count为共享变量,线程1执行代码段A,线程2指向代码段B,那么变量count的值可能为
int count = 10;
代码段A:
Thread_1()
{
//do something
count++;
}
代码段B:
Thread_2()
{
//do something
count--;
}
9
10
11
12
正确答案: A B C
int main()
{
char *p = "hello,world";
return 0;
}
p和"hello,world"存储在内存哪个区域?
栈,堆
栈,栈
堆,只读存储区
栈,只读存储区
正确答案: D
下面有关内核线程和用户线程说法错误的是?
用户线程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会
内核线程只运行在内核态,不受用户态上下文的影响。
用户线程和内核线程的调度都需要经过内核态。
内核线程有利于发挥多处理器的并发优势,但却占用了更多的系统开支。
正确答案: C
使用useradd创建用户时和主目录相关的参数是()
p
d
m
M
正确答案: B C D
···
关于 Linux 系统上同一个程序的多个进程实例共享一个 TCP 监听端口的说法, 哪个不正确?
每个进程都使用 SO_REUSEPORT 选项,然后绑定同一个地址和端口
每个进程分别绑定不同的网卡地址的同一端口
第一个进程先绑定到监听地址端口, 然后 fork 子进程共享使用
每个进程分别绑定一次, 但只有最后一个调用的进程才能收到数据
正确答案: D
运行在多核处理器上的Linux环境中,若临界区非常短,且不允许线程上下文切换的情况下,使用下列哪种机制满足上述需求并且性能最好?
SpinLock
Mutex
Semaphore
Condition variable
正确答案: A
不算 main 这个进程自身,到底创建了多少个进程啊?
int main(int argc, char* argv[])
{
fork();
fork() && fork() || fork();
fork();
}
18
19
20
21
正确答案: B
下面哪些函数调用必须进入内核才能完成?
fopen
exit
memcpy
strlen
正确答案: A B
bash中,需要将脚本demo.sh的标准输出和标准错误输出重定向至文件demo.log,以下哪些用法是正确的()
bash demo.sh &>demo.log
bash demo.sh>&demo.log
bash demo.sh >demo.log 2>&1
bash demo.sh 2>demo.log 1>demo.log
正确答案: A B C
用C++语法来看,下列的哪个赋值语句是正确的?
char a=12
int a=12.0
int a=12.0f
int a=(int)12.0
正确答案: A B C D
extern "C"{}的作用以及能解决什么问题?
在C++源文件中的语句前面加上extern "C",表明它按照类C的编译和连接规约来编译和连接,而不是C++的编译的连接规约
主要是解决在C++代码中调用C代码
主要是解决在C代码中调用C++代码
上述描述都不正确
正确答案: A B
以下叙述中正确的是()
逻辑"或"(即运算符||)的运算级别比算术运算要高
C语言的关系表达式:0<x<10完全等价于: (0<x) && (x<10)
逻辑"非"(即运算符!)的运算级别是最低的
由&&构成的逻辑表达式与由||构成的逻辑表达式都有"短路"现象
正确答案: D
以下是C++的不同数据类型值的比较语句,请问这些判断语句中作为条件部分的语句编写有问题的有:
如果变量bVar是布尔类型:if(false==bVar){doSomeThing();}
如果变量nVar是int型:if(0==nVar){doSomeThing();}
如果变量fVar为浮点型:if(0.02=fVar){doSomeThing();}
如果变量sVar为字符串型:if(""==sVar){doSomeThing();}
正确答案: C
下面关于Spring的说法中错误的是Spring是一系列轻量级Java EE框架的集合Spring中包含一个“依赖注入”模式的实现使用Spring可以实现声明式事务Spring提供了AOP方式的日志系统正确答案: DSpring框架中的核心思想包括什么?依赖注入控制反转面向对象面向切面正确答案: A B D在Spring框架中获取连接池可以有哪些方式?DBCP数据源...