欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

core java interview point (3)

程序员文章站 2022-05-14 18:00:20
...

 24. 写出生产者消费者模式。

生产者消费者模式是比国内法、多线程编程中经典的设计模式,通过分离的执行工作解耦,简化开发模式,他们又可以以不同的熟读生产、消费数据。

sample:服务员在准备食物(生产者),顾客在等待吃(消费者),他们通过共同约定的桌子等存放、取走这些盘子。如果桌子上已经满了服务员(生产者)就等待,如果食物以及给你吃完了顾客(消费者)等待。这里的桌子就是一个共享对象。

特征和优点:

a.简化开发,独立的开发或者并发的编写消费者和生产者,他们之间仅仅需要知道共享对象是谁。

b.生产者不需要关心谁是消费者或者有多少消费者(不管顾客是谁,有多少人)消费者亦然(不管那个服务员)

c.生产者和消费者可以使用不同的速度

d.分离的生产者、消费者在功能上可以写出更简洁、可读、以维护的代码。

 

多线程中的生产者、消费者问题:

这是一个典型的问题,经典方法:使用wait和notify方法在生产者、消费者线程中合作;在队列满了或者是空的条简写阻塞。java5天界了阻塞队列BlockingQueue数据结构,它隐含了这种机制,就无需wait/notify在二者之间通信,它提供的put()方法将阻塞满了的condition,take()方法将阻塞空的condition。

 

使用阻塞队列实现生产者消费者:

 阻塞队列实现,提供开箱即支持阻塞的方法put()和take(),开发者不用写冗余繁杂的wait-notify实现通信。

 BlockingQueue是一个接口,两种实现子类:ArrayBlockingQueue,LinkedBlockingQueue,都是先进先出原则,ArrayBlockingQueue是自然有界的(事先能够预知边界),LinkedBlockingQueue可选边界(无法预知边界)。

 

Demo:

public class ProducerConsumerInstance{

 public static void main(String[] args){

  //shared bolckingQueue instance

  BlockingQueue sharedQueue = new LinkedBlockingQueue();

 

  //producer

  Thread producer = new Thread(new Producer(sharedQueue));

  //consumer 

  Thread consumer = new Thread(new Consumer(sharedQueue));

 

  //run 

  producer.start();

  consumer.start();

 }

}

 

//class Producer

public class Producer implements Runnable{

 private final BlockingQueue producerQueue;

 public Producer(BlockingQueue shared){

  producerQueue = shared;

 }

 

 @Override

 public void run(){

  for(int i = Math.random(); i < 0.999; ){

   try{

    System.out.println(producer.put(i));

   }catch(InterruptedException e){

    Syetem.out.print("ERROR by interrupting.");

   }

  }

 }

}

 

//Consumer class ommit...

 

 

25. ThreadLocal的设计理念与作用。

ThreadLocal与其他同步机制相比:

 ThreadLocal和其他所有的同步机制,都是为了解决多线程之间对同一个变量的访问导致的冲突问题。

在普通的同步机制中,通过对象加锁来实现多线程对统一变量的安全访问,这时候变量是对个线程共享的,使用这些同步机制,就需要很细致研究分析什么时候对变量读写而需要加锁,什么时候释放锁。

TheadLocal会为每个线程维护一个和该线程绑定的变量的副本,从另一角度,根本上隔离了多个线程之间对同一对象的访问问题,从而就不存在对该变量同步。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时候,将不安全的整个变量封装进ThreadLocal,或者将该对象特定于线程的撞他起状态封装进ThreadLocal。

 

ThreadLocal不能取代同步机制,两者面对的领域不同;同步机制是为了同步多个线程对相同资源的并发访问,能够使这些线程之间通信。而ThreadLocal是隔离了多个线程的数据共享,拆分为每个线程绑定的变量副本,从根本上就不再是多个线程间的共享变量了。

如果你需要多线程通信,使用同步机制,而仅仅事项隔离线程间的共享冲突,ThreadLocal不错的选择。

 

ThreadLocal,线程局部变量thread local variable,功能就是为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立改变自己的副本,而不会和其他线程的副本冲突。

 

ThreadLocal类的方法:

protected ThreadLocal initialValue(),是为了子类重写,该方法返回当前线程在该线程局部变量的初始值,是延迟电泳方法,在一个线程第一次调用get()或set()执行,只执行一次。

public ThreadLocal get() 返回当前线程的线程局部变量副本

public void set(ThreadLocal val) 设置当前线程的线程局部变量的副本值。

public void remove() 移除当前线程的线程局部变量值,释放资源