关闭

线程中的同步代码块synchronized、同步方法和同步锁Lock

标签: java线程线程安全多线程代码
3472人阅读 评论(0) 收藏 举报
分类:

在学习线程的时候,因为线程的调度具有不确定性,所以银行取钱问题、多个窗口售卖火车票问题都是反应多线程的优越性以及不确定性。当程序中有多个并发线程在进入一个代码块中并且修改其中参数时,就很有可能引发线程安全问题从而造成异常。
同步代码块
所以,java在其中就引入了同步监视器来解决关于多线程的支持问题

synchronized(obj)
{
    同步代码块
}

上面就是同步的代码块方式,也就是说,当线程开始执行同步代码块之前,必须先获得对同步监视器的锁定,而且无论在什么时候,只能有一个线程可以获得对同步监视器的锁定,当同步代码执行完成之后,这个线程会释放该线程的同步监视器的锁定。
任何线程在修改指定的参数资源之前,都需要对该参数资源加锁,在加锁期间其他的线程是不能对这个参数资源进行修改的,只有在该线程完成修改并且释放对该参数的锁定之后其他线程才有机会对该参数进行修改。这样做也就是符合了“加锁–>修改–>释放”的逻辑顺序。
同步方法
其实这个还有一个同步方法,也就是用关键字synchronized来修饰一个方法,对于关键字synchronized修饰的方法,就不需要再指定同步监视器了,因为同步方法的同步监视器就是this,也就是调用了该方法的对象。

public synchronized void testThread()
{
    //需要执行的代码块
}

需要注意的是:synchronized可以修饰方法和代码块,就是不能修饰构造器和成员变量等。

同步锁
Lock提供了比synchronized更加广泛的锁定操作,能够实现更灵活的结构,而且支持多个condition对象。
在实现线程安全的控制中,比较常用的是ReentrantLock,使用该对象可以显式的加锁和释放锁,格式如下:

class A
{
    private final ReentrantLock lock=new ReentrantLock();
    public void b()
    {
        lock.lock();
        try{
                //需要执行的代码块
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                lock.unlock();
            }
    }
}

为了确保能够在必要的时候释放锁,所以上面的代码中使用finally来确保锁的释放。

2
0
查看评论

java中的synchronized(同步代码块和同步方法的区别)

问题的由来: 看到这样一个面试题: //下列两个方法有什么区别 public synchronized void method1(){}public void method2(){ synchronized (obj){} } synchronized用于解决同步问题,当有多条线程同时...
  • H_Gao
  • H_Gao
  • 2016-08-21 13:48
  • 23829

同步代码块、同步方法、锁总结

同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块,其语法如下: synchronized(obj){ //同步代码块 } 其中obj就是同步监视器,它的含义是:线程开始执行同步代码块之前,必须先获得对同步代码块...
  • weixin_36937689
  • weixin_36937689
  • 2017-06-07 22:34
  • 231

JAVA 同步代码块synchronized

//仅作为学习笔记 /* JAVA对于多线程的安全问题提供了专业的解决方式 就是同步代码块 synchronized(对象)//这个对象可以为任意对象 { 需要被同步的代码 } 对象如同锁,持有锁的线程可以在同步中执行 没持有锁的线程即使获取CPU的执行权,也进不去 同步的前提: 1...
  • wu_lai_314
  • wu_lai_314
  • 2013-03-10 14:49
  • 27351

线程安全问题(银行取钱问题)、同步代码块、同步方法

(1)线程安全问题: 关于线程安全问题,有一个经典的问题–银行取钱问题。银行取钱可以分为以下步骤: 1.用户输入账户密码,系统判断账户密码是否匹配 2.用户输入取款金额 3.系统判断账户余额是否大于取款金额 4.如果账户余额大于取款金额,则取钱成功,如果余额小于取款金额,则取款失败//按上...
  • zlz18225318697
  • zlz18225318697
  • 2016-09-21 13:56
  • 853

java 同步锁(synchronized)

java 同步锁(synchronized)
  • lianqiangjava
  • lianqiangjava
  • 2013-10-12 15:30
  • 70011

简单注解实现集群同步锁(spring+redis+注解)

互联网面试的时候,是不是面试官常问一个问题如何保证集群环境下数据操作并发问题,常用的synchronized肯定是无法满足了,或许你可以借助for update对数据加锁。本文的最终解决方式你只要在方法上加一个@P4jSyn注解就能保证集群环境下同synchronized的效果,且锁的key可以任意...
  • partner4java
  • partner4java
  • 2016-08-13 13:57
  • 6782

Android开发笔记(八十八)同步与加锁

同步synchronized 同步方法 synchronized可用来给方法或者代码块加锁,当它修饰一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。这就意味着,当两个并发线程同时访问synchronized代码块时,两个线程只能是排队做串行处理,另一个线程要等待前一个线程执行完该...
  • aqi00
  • aqi00
  • 2016-04-20 14:19
  • 3700

多线程同步锁synchronized(全局锁,对象锁)

synchronized锁住的是代码还是对象  在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。synchronized既可以加在一段代码上,也可以加在方法上。 关键是,不要认为...
  • jintiaozhuang
  • jintiaozhuang
  • 2017-02-08 15:19
  • 2985

spring实现集群同步锁

  • 2016-08-16 18:36
  • 14KB
  • 下载

spring(基础18) Sprin事务和synchronized锁的一些问题

1 问题描述 最近有小伙伴在做商品抽奖活动时,在对奖品库存进行扣减,有线程安全的问题,遂加锁synchronized进行同步, 但发现加锁后并没有控制住库存线程安全的问题,导致库存仍被超发。 先简单介绍下,各层的技术架构: 中间层框架:Spring 4.1.0 持久层:My...
  • zengdeqing2012
  • zengdeqing2012
  • 2017-01-11 12:33
  • 3033
    个人资料
    • 访问:103818次
    • 积分:1523
    • 等级:
    • 排名:千里之外
    • 原创:62篇
    • 转载:15篇
    • 译文:0篇
    • 评论:17条
    新浪微博
    文章分类