技术开发 频道

AOP详解和AspectJ

【IT168 技术文档】

  需求和问题

  以上篇《AOP是什么》中并发访问应用为例子:

  多个访问类同时访问一个共享数据对象时,每个访问类在访问这个数据对象时,需要将数据对象上锁,访问完成后,再实行解锁,供其它并发线程访问,这是我们处理并发访问资源的方式。

  为了实现这个需求,先实现传统的编程,这里我们假定有一个写锁,对数据对象实行写之前,首先对这个对象进行上写锁,写操作完毕后,必须释放写锁。

  首先,我们需要一个锁,这个锁可以是数据对象中一个字段或其它,这里使用Doug Lea的ReentrantWriterPreferenceReadWriteLock作为我们的锁资源。

import EDU.oswego.cs.dl.util.concurrent.*; public class Worker extends Thread {   Data data;   ReentrantWriterPreferenceReadWriteLock rwl =      new ReentrantWriterPreferenceReadWriteLock();   public boolean createData() {    try {     rwl.writeLock().acquire(); //上锁     //对data实行写逻辑操作             }catch() {      return false;    }finally{      rwl.writeLock().release();  //解锁    }    return true;   }   public boolean updateData() {    try {     rwl.writeLock().acquire();//上锁     //对data实行写逻辑操作             }catch() {      return false;    }finally{      rwl.writeLock().release(); //解锁    }    return true;   }   public void run() {     //执行createData()或updateData()   } }
  假设可能存在另外一个访问类,也将对数据对象实现写操作,代码如下:
import EDU.oswego.cs.dl.util.concurrent.*; public class AnotherWorker extends Thread {   Data data;   ReentrantWriterPreferenceReadWriteLock rwl =      new ReentrantWriterPreferenceReadWriteLock();      public boolean updateData() {    try {     rwl.writeLock().acquire();//上锁     //对data实行写逻辑操作             }catch() {      return false;    }finally{      rwl.writeLock().release(); //解锁    }    return true;   }   public void run() {     //执行updateData()   } }
  以上是Java传统编程的实现,这种锁的实现方式是在每个具体类中实现:


0
相关文章