在实现一次对限流接口访问时,我错误的使用了单例+synchronized修饰方法的形式实现,这样在限流方规则为不同接口不同限制,单独限制时,同一个实例中的所有被synchronized修饰的方法竞争同一个锁。因为synchronized是 锁对象!

因此,可以创建多个ReentrantLock锁,在方法中进行灵活锁定和解锁。

package com.cb.account.controller;

import java.util.concurrent.locks.ReentrantLock;

public class SingleD {

  private static SingleD singleD;
private final ReentrantLock test1_lock = new ReentrantLock();
private final ReentrantLock test2_lock = new ReentrantLock(); public static SingleD getInstance() {
if (singleD == null) {
singleD = new SingleD();
}
return singleD;
}
public synchronized void test1() {
test1_lock.lock();
System.out.println("test1");
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
test1_lock.unlock();
}
} public void test2() {
test2_lock.lock();
System.out.println("test2");
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
test2_lock.unlock();
}
}
public void test3() {
System.out.println("test3");
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

验证:

package com.cb.account.controller;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Mt { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(6);
executorService.execute(new Runnable() {
SingleD singleD = SingleD.getInstance();
@Override
public void run() {
singleD.test1();
}
}
);
executorService.execute(new Runnable() {
SingleD singleD = SingleD.getInstance();
@Override
public void run() {
singleD.test2();
}
}
);
executorService.execute(new Runnable() {
SingleD singleD = SingleD.getInstance();
@Override
public void run() {
singleD.test1();
}
}
);
// executorService.execute(new Runnable() {
// @Override
// public void run() {
// singleD.test3();
// }
// }
// );
} }

synchronized锁级别的一个坑的更多相关文章

  1. 记一次synchronized锁字符串引发的坑兼再谈Java字符串

    问题描述 业务有一个需求,我把问题描述一下: 通过代理IP访问国外某网站N,每个IP对应一个固定的网站N的COOKIE,COOKIE有失效时间.并发下,取IP是有一定策略的,取到IP之后拿IP对应的C ...

  2. 记一次 synchronized 锁字符串引发的坑兼再谈 Java 字符串

    业务有一个需求,我把问题描述一下: 通过代理IP访问国外某网站N,每个IP对应一个固定的网站N的COOKIE,COOKIE有失效时间. 并发下,取IP是有一定策略的,取到IP之后拿IP对应的COOKI ...

  3. Java synchronized对象级别与类级别的同步锁

    Java synchronized 关键字 可以将一个代码块或一个方法标记为同步代码块.同步代码块是指同一时间只能有一个线程执行的代码,并且执行该代码的线程持有同步锁.synchronized关键字可 ...

  4. 多线程之Synchronized锁的基本介绍

    基本介绍 synchronized是Java实现同步的一种机制,它属于Java中关键字,是一种jvm级别的锁.synchronized锁的创建和释放是此关键字控制的代码的开始和结束位置,锁是有jvm控 ...

  5. 015-线程同步-synchronized几种加锁方式、Java对象头和Monitor、Mutex Lock、JDK1.6对synchronized锁的优化实现

    一.synchronized概述基本使用 为确保共享变量不会出现并发问题,通常会对修改共享变量的代码块用synchronized加锁,确保同一时刻只有一个线程在修改共享变量,从而避免并发问题. syn ...

  6. java并发笔记之证明 synchronized锁 是否真实存在

    警告⚠️:本文耗时很长,先做好心理准备 证明:偏向锁.轻量级锁.重量级锁真实存在 由[java并发笔记之java线程模型]链接: https://www.cnblogs.com/yuhangwang/ ...

  7. Synchronized锁升级

    Synchronized锁升级 锁的4中状态:无锁状态.偏向锁状态.轻量级锁状态.重量级锁状态(级别从低到高) 为什么要引入偏向锁? 因为经过HotSpot的作者大量的研究发现,大多数时候是不存在锁竞 ...

  8. synchronized锁机制的实现原理

    Synchronized 锁机制的实现原理 Synchronized是Java种用于进行同步的关键字,synchronized的底层使用的是锁机制实现的同步.在Java中的每一个对象都可以作为锁. J ...

  9. 从此不怕Synchronized锁

    Synchronized的使用 ​ Synchronized是通过监视器保证线程同步从而保证线程安全.但是Synchronized锁可以锁对象和锁类,并会产生不同的效果,通过下面的案例彻底理解Sync ...

随机推荐

  1. ElasticSearch 6.4.3 启动报错: [Cannot assign requested address: bind]

    今天在本地搭建一个测试用的最新版ElasticSearch6.4.3 的环境时,遇到一个报: [Cannot assign requested address: bind]的错误. 错误日志内容如下: ...

  2. 【自动化测试】robot framwork的一点小发现

    我们在搭建完robotframwork框架并开始打开火狐浏览器的时候,总会碰到打不开浏览器的问题.这次,分享一个常见的小问题. 这个问题呢,是因为火狐的版本更新频繁,导致selenium的版本跟不上导 ...

  3. PropertyEditor、Formatter、Converter的应用

    @ResponseBody @RequestMapping("date.do") public String data(Date date) { return date.toStr ...

  4. C++调用C语言的库函数

    在项目中,使用C语言编写了一个socket后台程序tkcofferd,并且为方便客户端的使用,提供了动态库,其中包含socket接口. 现在的需求是使用qt做一个前端界面,用来展示tkcofferd的 ...

  5. document.querySelectorAll() 兼容 IE6

    不多说,直接上代码 // 使用 css 选择器获取元素对象 兼容性封装 Test Already. function getElementsByCss(cssStr){ if(document.que ...

  6. Hangover POJ - 1003

    How far can you make a stack of cards overhang a table? If you have one card, you can create a maxim ...

  7. 十、JSTL标签库

      l JSTL标签库(重点) l 自定义标签(理解) l MVC设计模式(重点中的重点) l Java三层框架(重点中的重点) JSTL标签库 1 什么是JSTL JSTL是apache对EL表达式 ...

  8. nginx r日志中午出现\xE5\x88\x98\xE4\xB8\x96\xE5\xA5\x87

    参考文档: https://www.cnblogs.com/hark0623/p/5715726.html https://www.cnblogs.com/fqfanqi/p/7900758.html ...

  9. Java根据链接生成二维码

    Java根据链接生成二维码 相关 jar 包: core-3.1.0.jar 源码及 jar 包下载:http://files.cnblogs.com/files/liaolongjun/qrcode ...

  10. day27:反射和双下方法

    1, # 面向对象的三大特性:继承,多态和封装 # 继承: # 单继承: **** # 父类(超类,基类) # 子类(派生类) 派生方法和派生属性 # 子类的对象在调用方法和属性:先用自己的,自己没有 ...