很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework),理解核心线程概念时,娴熟的实际经验是必需的。这篇文章收集了 Java 线程方面一些典型的问题,这些问题经常被高级工程师所问到。 很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework),理解核心线程概念时,娴熟的实际经验是必需的。这篇文章收集了 Java 线程方面一些典型的问题,这些问题经常被高级工程师所问到。
之前读到这边文章,觉得还不错,所以在这里分享给大家。
ThreadLocal 是一个线程级别的局部变量,并非“本地线程”。ThreadLocal 为每个使用该变量的线程提供了一个独立的变量副本,每个线程修改副本时不影响其它线程对象的副本(译者注)。
下面是线程局部变量(ThreadLocal variables)的关键点:
一个线程局部变量(ThreadLocal variables)为每个线程方便地提供了一个单独的变量。
ThreadLocal 实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程。
当多个线程访问 ThreadLocal 实例时,每个线程维护 ThreadLocal 提供的独立的变量副本。
常用的使用可在 DAO 模式中见到,当 DAO 类作为一个单例类时,数据库链接(connection)被每一个线程独立的维护,互不影响。(基于线程的单例)
ThreadLocal 难于理解,下面这些引用连接有助于你更好的理解它。
《Good article on ThreadLocal on IBM DeveloperWorks 》、《理解 ThreadLocal》、《Managing data : Good example》、《Refer Java API Docs》
public class Common { public synchronized void synchronizedMethod1() { System.out.println ("synchronizedMethod1 called"); try { Thread.sleep (1000); } catch (InterruptedException e) { e.printStackTrace (); } System.out.println ("synchronizedMethod1 done"); } public void method1() { System.out.println ("Method 1 called"); try { Thread.sleep (1000); } catch (InterruptedException e) { e.printStackTrace (); } System.out.println ("Method 1 done"); } } public class MyThread extends Thread { private int id = 0; private Common common; public MyThread (String name, int no, Common object) { super(name); common = object; id = no; } public void run () { System.out.println ("Running Thread" + this.getName ()); try { if (id == 0) { common.synchronizedMethod1(); } else { common.method1(); } } catch (Exception e) { e.printStackTrace (); } } public static void main (String[] args) { Common c = new Common (); MyThread t1 = new MyThread ("MyThread-1", 0, c); MyThread t2 = new MyThread ("MyThread-2", 1, c); t1.start (); t2.start (); } }
public class Common { public synchronized void synchronizedMethod1() { System.out.println ("synchronizedMethod1 called"); try { Thread.sleep (1000); } catch (InterruptedException e) { e.printStackTrace (); } System.out.println ("synchronizedMethod1 done"); } public synchronized void synchronizedMethod2() { System.out.println ("synchronizedMethod2 called"); try { Thread.sleep (1000); } catch (InterruptedException e) { e.printStackTrace (); } System.out.println ("synchronizedMethod2 done"); } } public class MyThread extends Thread { private int id = 0; private Common common; public MyThread (String name, int no, Common object) { super(name); common = object; id = no; } public void run () { System.out.println ("Running Thread" + this.getName ()); try { if (id == 0) { common.synchronizedMethod1(); } else { common.synchronizedMethod2(); } } catch (Exception e) { e.printStackTrace (); } } public static void main (String[] args) { Common c = new Common (); MyThread t1 = new MyThread ("MyThread-1", 0, c); MyThread t2 = new MyThread ("MyThread-2", 1, c); t1.start (); t2.start (); } }
线程饿死和活锁虽然不想是死锁一样的常见问题,但是对于并发编程的设计者来说就像一次邂逅一样。
当所有线程阻塞,或者由于需要的资源无效而不能处理,不存在非阻塞线程使资源可用。JavaAPI 中线程活锁可能发生在以下情形:
当所有线程在程序中执行 Object.wait (0),参数为 0 的 wait 方法。程序将发生活锁直到在相应的对象上有线程调用 Object.notify ()或者 Object.notifyAll ()。
当所有线程卡在无限循环中。
这里的问题并不详尽,我相信还有很多重要的问题并未提及,您认为还有哪些问题应该包括在上面呢?欢迎在评论中分享任何形式的问题与建议。
本文转自:http://www.csdn.net/article/2012-05-28/2806046