简述jvm中堆和栈的区别
栈内存: 在方法中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配
当在一段代码块定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后
java会自动释放掉为该变量所分配的内存空间, 该内存空间可以立即被另作他用
堆内存: 堆内存用来存放由new创建的对象和数组. 在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理
String StringBuilder StringBuffer的区别
String创建的对象是不可变的 改变赋值 只是更改对象的引用
String和StringBuffer是线程安全的,StringBuilder是线程不安全的
Java中Thread类的start()方法和run()方法有什么区别
start()方法是用于构建完Thread实例后,用来让线程处于启动的状态的,但是线程有可能不是马上开始执行。
run()是线程执行逻辑操作的地方
Java 中 sleep 方法和 wait 方法的区别?
虽然两者都是用来暂停当前运行的线程,但是 sleep() 实际上只是短暂停顿,因为它不会释放锁
而 wait() 意味着条件等待,这就是为什么该方法要释放锁,因为只有这样,其他等待的线程才能在满足条件时获取到该锁。
ThreadLocal概念:
线程局部变量,是一种多线程间并发访问变量的解决方案。
与其synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全。
简单介绍volatile和synchronized的区别
volatile和synchronized简介:
在Java中,为了保证多线程读写数据时保证数据的一致性,可以采用两种方式:
1)使用synchronized关键字
2)使用volatile关键字:用一句话概括volatile,它能够使变量在值发生改变时能尽快地让其他线程知道。
两者的区别:
1)volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.
2)volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.
3)volatile仅能实现变量的修改可见性,而synchronized则可以保证变量的修改可见性和原子性.
4)volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞
ArrayList 和 HashMap 的默认大小是多少
ArrayList 的默认大小是 10 个元素扩容增量:原容量的 0.5倍+1
HashMap 的默认大小是16个元素(必须是2的幂)
加载因子为0.75
扩容增量:原容量的 1 倍
关于Spring事务配置不起作用问题总结
(1)数据库非事务支持引擎导致
(2)@Transactional注解只能应用到public可见度的方法上。如果你在projected,private的方法上使用@Transactional,它也不会保错,事务也会失效
(3)aop只能捕获runtimeexception的异常
消息队列丢失消息
解决方案
(1)消息持久化
(2)消息补偿机制
数据库
数据库设计的三范式
数据库事务四大特性