多線程環(huán)境下洒宝,會出現(xiàn)線程不安全的問題,所以要對某些方法加鎖以保證線程安全萌京。常用的方法有:
final Reentrantlock lock = new Reentrantlock();
public void func(){
lock.tryLock();
//TODO
lock.unlock();
}
但是如果方法過多雁歌,每個方法前后都加這么一句,有點(diǎn)麻煩了知残,而且代碼可讀性也會差一些靠瞎。可以使用aop切面編程橡庞,對某些加有特定注解(自定義注解)的方法做加鎖操作即可较坛。
定義注解
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface TryLock(){
//TODO
}
定義切面類
public class TryLockAop{
final ReentrantLock lock = new ReentrantLock();
public Object trylockByAop(ProceedingJoinPoint joinPoint){
Object obj = null;
try{
if(!lock.tryLock()){
throw new IllegalArgumentException("當(dāng)前資源證被占用");
}
System.out.println("已成功加鎖");
obj = joinPoint.proceed();
}catch(Throwable){
//TODO
}finally{
if(lock.isLocked()){
lock.unlock();
System.out.println("已成功釋放");
}
}
return obj;
}
}
定義使用類
public class HelloWorld{
//使用自定義注解@TryLock
@TryLock
public void hello(){
System.out.println("hello world");
}
}
配置文件
<bean id="helloWorld" class="com.xxx.HelloWorld"/>
<bean id="TryLockAop" class="com.xxx.TryLockAop"/>
<aop:config>
<aop:aspect>
<!-- 對加有注解@TryLock的方法執(zhí)行該切面的方法 -->
<aop:pointcut id="testTrylockPoint" expression="@annotation(com.xxx.TryLock)" />
<aop:around method="trylockByAop" pointcut-ref="testTrylockPoint"/>
</aop:aspect>
</aop:config>
測試
public static void main(String[] args){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
context.start();
HelloWorld hello = (HelloWorld)context.getBean("HelloWorld");
hello.hello();
}
結(jié)果為:
已成功加鎖
hello
已成功釋放