基础6-- JD
锁
- 什么是死锁?
当线程A持有独占锁a,并尝试获取独占锁b的同时,线程B持有独占锁b,并尝试获取独占锁a的情况下,就会发生AB两个线程由于互相持有对方需要的锁,而发生的阻塞的现象, 我们称为死锁。 - synchronized和lock有什么区别?
synchronized可以给类、方法、代码块加锁,而lock只能给代码块加锁。
synchronized不需要手动获取和释放锁,使用简单,发成异常会自动释放锁,不会造成死锁;而lock需要自己加锁和释放锁,如果使用不当没有unlock()去释放锁就会造成死锁。
Lock lock = new ReentrantLock();
lock.lock();
try{
System.out.println("获得锁");
}catch (Exception e){
//TODO: handle exception
}finally {
System.out.println("释放锁");
lock.unlock();
}
准备的就问了一两道。还是基础不过关。
-
简介自己的项目。以及项目的相关过程。下次技术要突出!
-
你是怎么学的java?
其实开始问我什么时候学的Java,但是我简历上有,就问怎么学的???看书加课程?? -
你们的项目投入使用了吗?
-
java中的重载和覆盖?(初学者低水平公司喜欢问。。因为他们没有放在一起比较本身没有太大的意义。因为重载主要发生在同一个类的多个同名方法之间,而重写发生在子类和父类的同名方法之间,他们之间的联系很少。)
(1)重载:overload
方法重载的要求就是两同一不同:同一个类中方法名相同,参数列表不同。 至于方法的其他部分,如方法的返回值类型,修饰符等,与方法重载没有任何关系。
(2)重写:override
定义:子类包含与父类同名方法的现象叫做方法重写,也称为方法覆盖。可以说子类重写了父类的方法, 也可以说子类覆盖了父类的方法。
方法重写要遵循两同两小一大规则:两同即方法名相同,形参列表相同;两小指的是子类方法的返回值类型 <= 父类方法返回值类型,子类方法声明抛出的异常 <= 父类方法声明抛出的异常类;一大指的是子类方法的访问权限 >= 父类方法的访问权限。
注意:覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法。 -
死锁(以及造成死锁的4个必要条件)
(1) 互斥条件:进程对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
(2) 不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程主动释放。
(3) 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
(4) 环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
- 数据库中的视图和表的区别?
区别:
1、视图是已经编译好的sql语句,而表不是。
2、视图没有实际的物理记录,而表有。
3、表是内容,视图是窗口。
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改。
5、表是内模式,视图是外模式。
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
9、不能对视图进行update或者insert into操作。
联系:
视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。 - java中set和list的区别?
- java 中进行值传递和引用的区别?
这个比较早了,然后忘了。
基本数据类型传值:方法中对参数的修改,不会对主方法中传来的变量值产生影响。
引用数据类型传值:方法中对数组的改变,会影响主方法中出来的数组。
(1) 值传递:就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到任何影响。
public class PrimitiveTansferTest {
public static void swap(int a, int b){
//下面代码实现a,b变量的值交换
int temp = a;
a = b;
b = temp;
System.out.println("swap方法里,a的值是" + a + ",b的值是" + b);
}
public static void main(String[] args){
int a = 6;
int b = 9;
swap(a, b);
System.out.println("交换结束后,变量a的值是" + a + ";变量b的值是" + b);
}
}
(2)引用类型的参数传递,传递对象的地址。引用传递是把内存中对象的引用地址传递给变量,首先创建对象时会在jvm的堆内存中分配存储,把对象赋值给变量时,会在栈中创建一个堆内存的引用,变量指向的就不是堆中的对象,而是栈中的引用。
class DataWrap{
public int a;
public int b;
}
public class ReferenceTransferTest {
public static void swap(DataWrap dw){
int temp = dw.a;
dw.a = dw.b;
dw.b = temp;
System.out.println("swap方法里,a Filed 的值是" + dw.a + ";b Filed 的值是" + dw.b);
}
public static void main(String[] args) {
DataWrap dw = new DataWrap();
dw.a = 6;
dw.b = 9;
swap(dw);
System.out.println("交换后,a Filed 的值是" + dw.a + ";b Filed 的值是" + dw.b);
}
}
- 参考: 《java疯狂讲义》p115-p118
例子2:
String str = new String("hello");
char[] ch = {'a', 'b'};
public static void main(String[] args) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.println(ex.str + " and");
System.out.println(ex.ch);
}
public void change(String str, char[] ch){
str = "ok";
ch[0] = 'c';
}
- 你的五年规划是什么?
我该好好想想了。 - 你可以问我问题
京东实习转正之类。
已凉。