基础6

本文深入探讨Java中的死锁现象,包括其定义、原因及预防措施,并对比synchronized与lock关键字的区别。同时,文章解析数据库中视图与表的本质差异,以及Java中set与list的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础6-- JD

  1. 什么是死锁?
    当线程A持有独占锁a,并尝试获取独占锁b的同时,线程B持有独占锁b,并尝试获取独占锁a的情况下,就会发生AB两个线程由于互相持有对方需要的锁,而发生的阻塞的现象, 我们称为死锁。
  2. 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();
        }

准备的就问了一两道。还是基础不过关。

  1. 简介自己的项目。以及项目的相关过程。下次技术要突出!

  2. 你是怎么学的java?
    其实开始问我什么时候学的Java,但是我简历上有,就问怎么学的???看书加课程??

  3. 你们的项目投入使用了吗?

  4. java中的重载和覆盖?(初学者低水平公司喜欢问。。因为他们没有放在一起比较本身没有太大的意义。因为重载主要发生在同一个类的多个同名方法之间,而重写发生在子类和父类的同名方法之间,他们之间的联系很少。)
    (1)重载:overload
    方法重载的要求就是两同一不同:同一个类中方法名相同,参数列表不同。 至于方法的其他部分,如方法的返回值类型,修饰符等,与方法重载没有任何关系。
    (2)重写:override
    定义:子类包含与父类同名方法的现象叫做方法重写,也称为方法覆盖。可以说子类重写了父类的方法, 也可以说子类覆盖了父类的方法。
    方法重写要遵循两同两小一大规则:两同即方法名相同,形参列表相同;两小指的是子类方法的返回值类型 <= 父类方法返回值类型,子类方法声明抛出的异常 <= 父类方法声明抛出的异常类;一大指的是子类方法的访问权限 >= 父类方法的访问权限。
    注意:覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法。

  5. 死锁(以及造成死锁的4个必要条件)
    (1) 互斥条件:进程对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
    (2) 不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程主动释放。
    (3) 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
    (4) 环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

  1. 数据库中的视图和表的区别?
    区别:
    1、视图是已经编译好的sql语句,而表不是。
    2、视图没有实际的物理记录,而表有。
    3、表是内容,视图是窗口。
    4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改。
    5、表是内模式,视图是外模式。
    6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
    7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
    8、视图的建立和删除只影响视图本身,不影响对应的基本表。
    9、不能对视图进行update或者insert into操作。
    联系:
    视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
  2. java中set和list的区别?
  3. 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';
    }

在这里插入图片描述
在这里插入图片描述

  1. 你的五年规划是什么?
    我该好好想想了。
  2. 你可以问我问题
    京东实习转正之类。
    已凉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值