1.重写了Bean的equals方法,初始化两个属性相同的该Bean,放入HashSet中,最终会有几个元素?
答案:2个
虽然重写了equals方法,但是没有重写hashcode方法,所以hashSet在put的时候首先检查两个对象的hashcode是否相同,所以这两个Bean虽然属性一样,但hashcode不同,因此认为是不同的
2.synchronized对象锁和synchronized类锁的区别
类锁是指synchronized作用于静态方法或者代码块中
synchronized static public void getName(){}
synchronized (.class){}
对象锁是指synchronized作用于非静态方法时
synchronized public void getName(){}
区别
- .同个对象在多个线程中去调用synchronized作用的代码块,方法时需要获取对象锁。一个对象的对象锁是唯一的,只有一个线程可以拿到,因此当有线程在执行synchronized的方法时,其他线程需要进入阻塞队列等待
- 同个对象在多个线程中去调用不同的synchronized作用的代码块时,也需要获取锁,等待锁释放
- 同类的不同对象在多个线程中去调用synchronized作用的代码块、方法时需要获取对象锁。一个类的类锁是唯一的,只有一个线程可以拿到,因此当有对象在线程执行synchronized的方法时,其他线程的对象需要进入阻塞队列等待。
- 同个类的不同对象在多个线程中去调用不同的synchronized方法时也是需要等待的。
- 另外,如果多线程同时访问同一类的 类锁(synchronized 修饰的静态方法)以及对象锁(synchronized 修饰的非静态方法)这两个方法执行是异步的,原因:类锁和对象锁是2中不同的锁
- 类锁对该类的所有对象都能起作用,而对象锁不能。