java学习(二十二)

1、synchronized和可重入锁的区别

可重入性:
ReenTrantLock和synchronized使用的锁都是可重入的,两者都是同一个线程每进入一次,锁的计数器都自增1,所以等到锁的计数器下降为0时才能释放锁。

synchronized由编译器加锁和释放,默认是非公平锁,ReenTrantLock手动加锁和释放锁。
ReenTrantLock独有的能力:
ReenTrantLock可以指定是公平锁还是非公平锁,synchronized只能是非公平锁,所谓的公平锁就是先等待的线程先获取锁。
ReenTrantLock提供了中断锁和等待锁的功能,通过lock.lockInterruptibly()实现中断锁,通过lock.tryLock()实现等待锁。
ReenTrantLock提供了一个Condition类,实现了线程之间的通信。

什么情况下使用ReenTrantLock:
如果应用中需要有排队功能,比如客服分配,必须先到先得服务,不能出现饿死现象,可以使用ReenTrantLock的公平锁,new ReenTrantLock(true)表示公平锁。

2、synchronized加在static关键字前和普通方法前的区别

synchronized关键字加到static静态方法上是给Class类上锁,简称类锁(锁的是当前类的字节码)

而加到非static静态方法是给对象加锁

3、 除了垃圾回收,还有那些工作会造成CPU负载过高.

我们平常也肯能遇到代码中有比较耗时的计算。

排查过程:

  • 执行top -c ,显示进程运行信息列表。键入P (大写p),进程按照CPU使用率排序
  • top -Hp 10765 ,显示一个进程的线程运行信息列表。键入P (大写p),线程按照CPU使用率排序(进程10765内,最耗CPU的线程PID为10804,一般超过80%就是比较高的,80%左右是合理情况。)
  • 将线程PID转化为16进制:printf “%x” 10804。(10804对应的16进制是0x2a34,当然,这一步可以用计算器。)
  • jstack 10765 | grep ‘0x2a34’ -C5 --color

找到了耗CPU高的线程对应的线程名称“AsyncLogger-1”,以及看到了该线程正在执行代码的堆栈。

4、String a = “abc”;和String b = new String(“abc”);是不是一样的?为什么?他们对应的内存空间分别是什么?

String是final的,它存储在方法区的常量区,在定义a的时候,先去常量池找是否存在“test”常量,如果有就直接指向常量池的“test";如果没有,就在常量池存一个为“test"常量;

new 一个String对象的时候,这个时候会在堆内存中创建一个String 对象;但是a 依然指向的是常量池中的“test”,所以此时的a和b不是指向内存中的同一个地址,结果为false。

5、equals()与==的区别

  • 根类object中的equals()与==没有区别:

    如普通类Person中:
    Person per1 = new Person("张三",20);
    Person per2 = new Person("张三",20);
    System.out.print(per1.equals(per2));的结果为true。

  • String类改写了Object的equals();

    ==是指对内存地址的值进行比较
         equals()是对字符串的内容进行比较 
    如:String str1="hello";
           String str2=new String("hello");
           String str3=new String("hello").intern();
           System.out.print(str1.equals(str2));的结果为true,因为内容相同;
 System.out.print(str1==str2);的结果为false,因为str1为引用类型;"hello"会直接进入对象池(堆内存)中,而str2中的不会入池。二者的地     址当然不一样。
而经手动入池的str3保证了其地址的值相同

故:System.out.print(str1==str3);的结果为true。

6、byte a = 127; byte b = 127; a+=b和a = a+b的区别分别会出现什么问题

byte的范围为-128~127。

a+=b:编译器帮我们进行了强制类型转化

a=a+b:编译错误,需要强制类型转换。

若结果正确,得-2;

7、AOP的两种实现方式。

基于XML配置的Spring AOP

采用声明的方式实现(在XML文件中配置),大致步骤为:配置文件中配置pointcut, 在java中用编写实际的aspect 类, 针对对切入点进行相关的业务处理。

使用注解配置AOP

采用注解来做aop, 主要是将写在spring 配置文件中的连接点写到注解里面。

8、说一些Spring的事务传播机制。

REQUIRED

    定义:如果有事务则加入事务,如果没有事务,则创建一个新的(默认值)

NOT_SUPPORTED

    定义:Spring不为当前方法开启事务,相当于没有事务

REQUIRES_NEW

    定义:不管是否存在事务,都创建一个新的事务,原来的方法挂起,新的方法执行完毕后,继续执行老的事务

MANDATORY

    定义:必须在一个已有的事务中执行,否则报错

NEVER

    定义:必须在一个没有的事务中执行,否则报错

SUPPORTS

    定义:如果其他bean调用这个方法时,其他bean声明了事务,则就用这个事务,如果没有声明事务,那就不用事务

NESTED

    定义:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与REQUIRED类似的操作

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值