本帖最后由 垂天云 于 2013-9-5 07:25 编辑
通过看毕老师的视频,总结出一些面试时,常考的多线程知识点,请参考,欢迎纠错,欢迎补充!
一、调用线程的run方法与start方法有什么不同?
调用run方法依旧是主线程执行代码,新建线程没有开启。 调用start方法不仅运行了run中的方法,并开启了线程。
二、创建线程的两种方式有什么区别?
创建线程有实现方式和继承方式。 两者的区别是: 继承Thread:线程代码存放在Thread子类的run方法中。 实现Runnable:线程代码存在Runnable接口的子类run方法中。 需要注意的是:局部变量在每一个线程中都独有一份。 实现方式:避免了单继承的局限性。 在定义进程时,建议使用实现方式。
三、懒汉式和饿汉式有什么不同?
饿汉式——实例正常加载 懒汉式——实例延时加载 懒汉式在多线程访问的时候会出现安全问题,通过加同步的方式解决; 可以加同步代码块或者同步函数,但都比较低效; 再通过双重判断的方式解决效率问题, PS:加同步的时候锁是该类所属的字节码文件。 代码示例: - if(s==null)
- {
- synchronized(Single.class)
- {
- if(s==null)
- s = new Single();
- return s;
- }
- }
复制代码四、写一个死锁程序
- class Test implements Runnable
- {
- private boolean flag;
- Test(boolean flag)
- {
- this.flag = flag;
- }
- public void run()
- {
- if(flag)
- {
- while(true)
- {
- synchronized(MyLock.locka)
- {
- System.out.println(Thread.currentThread().getName()+"...if locka ");
- synchronized(MyLock.lockb)
- {
- System.out.println(Thread.currentThread().getName()+"..if lockb");
- }
- }
- }
- }
- else
- {
- while(true)
- {
- synchronized(MyLock.lockb)
- {
- System.out.println(Thread.currentThread().getName()+"..else lockb");
- synchronized(MyLock.locka)
- {
- System.out.println(Thread.currentThread().getName()+".....else locka");
- }
- }
- }
- }
- }
- }
- class MyLock
- {
- static Object locka = new Object();
- static Object lockb = new Object();
- }
- class DeadLockTest
- {
- public static void main(String[] args)
- {
- Thread t1 = new Thread(new Test(true));
- Thread t2 = new Thread(new Test(false));
- t1.start();
- t2.start();
- }
- }
复制代码 |