Java面试题----------一天两道之第六天

一、说说Synchronized关键字

答案: Synchronized关键字是用于解决并发情况下数据同步访问的一个重要关键字;它能保证线程安全,保证操作的原子性、变量的可见性和程序的有序性,保证同一时刻只有一个线程在进行访问;使用Synchronized关键字的方式有使用在方法上的称同步方法和以代码块方式使用的Synchronized同步块两种;当以同步块的方式使用时,需要对象锁或者类锁;当以同步方法的方式使用时会根据方法来决定使用锁,普通方法是对象锁,静态方法则是类锁
              两种使用方式的原理;以同步方法的方式使用时,JVM采用ACC_SYNCHRONIZED标记符来实现同步,当线程访问方法的时候会先检查这个标记符,如有该标记符就会去获取监视器Monitor,只有获取到监视器Monitor的线程才能执行,而每个对象有一个监视器Monitor,监视器被获取时会处于锁定状态;以同步块方式使用时,JVM使用monitorenter和monitorexit两个指令来实现同步,前者可理解成加锁指令,后者为释放锁指令;杜宇monitorenxter指令来说,会去获取监视器Monitor,只有获取到监视器Monitor的才能执行;对于Synchronized关键字来说,它底层本质可看成是通过一个监视器Monitor对象来完成的
Java面试题----------一天两道之第六天

 

二、ThreadLocal用使用过吗?如果没重写initalValue()就直接get()会怎样?

答案:ThreadLocal是用于为当前线程创建属于自己的变量的一个类,它的出现不是为了解决并发或者共享变量的;每个线程内部都有一个ThreadLocal.ThreadLocalMap类型的成员threadLocals,这个变量是用来存储实际变量副本的,ThreadLocal类能为当前线程创建属于自己的变量也是靠它,对于threadLocals来说,它的键为当前的ThreadLocal变量value为要存储的数据即变量副本;使用ThreadLocal的时候,它会利用当前线程来获取到threadLocals变量进行真正的存储;注意ThreadLocal类对象最终存的值都在当前的threadLocals变量中
             如果没有重写initalValue()方法就直接get()时,获取到的是null值
Java面试题----------一天两道之第六天
Java面试题----------一天两道之第六天

谢谢阅读,如有不对之处请指出!

·