请教一个关于java锁的问题,synchronized和lock的区别

pjlopjlo 2017-05-09 05:05:39
我现在代码有一个同步是用synchronized做的,但是由于同步代码段内部经常会卡死,导致这个同步段执行卡住。
synchronized(bizProxy){代码段},其中bizProxy为一个静态类。
现在想把syn控制的同步改成lock形式,不知道该怎么写?
此外,如果想实现如果代码段执行超时,则释放该锁,可以实现吗?
...全文
320 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
码匠笔记 2019-01-11
  • 打赏
  • 举报
回复
我觉得解决你这个问题不应该是使用Lock来解决,很多时候sync和lock其实都是可以解决问题的,反到 lock 需要自己释放锁。 我倒是觉得你可以考虑一下为什么你这个地方会卡主,从两点出发。 1,思考降低锁的力度,比如synchronized(businessid),businessId是你传递过来的业务ID,这样不互相干预的线程不会互相Block 2,思考异步解决这个问题,如果你的逻辑允许。 如果你想尝试Lock的方法很简单,下面代码是两种实现方式

public class SyncTest {
    public static void main(String[] args) {
        fun1("hello");
        fun2("world");
    }

    private static void fun2(String world) {
        Lock lock = new ReentrantLock();
        try {
            lock.lock();
        } finally {
            lock.unlock();
        }
    }

    private static void fun1(String businessId) {
        synchronized (businessId) {
            System.out.println(businessId);
        }
    }

}
小编为订阅号「码匠笔记」号主,先后就职于 ThoughtWorks、阿里巴巴等互联网公司的经验分享,包含但不限于 JAVA、并发编程、性能优化、架构设计、小程序、开源软件等。有兴趣可以关注一波,一起学习、讨论。
pjlopjlo 2017-05-09
  • 打赏
  • 举报
回复
一直不太明白,syn同步是对对象加锁,lock到底锁的是什么,是代码段还是代码段所在的类呢?求指点
hello_world_wsm 2017-05-09
  • 打赏
  • 举报
回复
也许这个对你有用 http://blog.csdn.net/yangzhaomuma/article/details/51236976
pjlopjlo 2017-05-09
  • 打赏
  • 举报
回复
ReentrantLock lock = new ReentrantLock(); if (lock.tryLock()) { try {代码段} finally{ lock.unlock(); }} else {System.out.println("*************获取锁超时*****************");} 这么写好像并没有控制住这段代码对poxy静态类的使用,仔细看了一下,两个访问这段代码的请求生成了两个锁,并没有产生互斥。

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧