并发编程----多线程(实现同步)二

1.线程安全

当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。

2.线程安全解决办法

  1. 使用多线程之前的同步或者使用锁(lock)
  2. 原理:将可能发送数据冲突问题,只能让当前一个线程进行。代码执行完成后释放锁,然后让其它线程执行。
  3. 线程之前同步:当多个线程共享同一个资源时,不会受到其它线程的干扰。

 2.1同步代码块

同步代码块就是将可能发生线程安全问题的代码,用synchronized给括起来。

synchronized(同一个数据){

  可能发生线程冲突的代码

}

2.2同步函数

在方法上用synchronized修饰的方式称为同步函数

例如:public synchronized void test(){}

同步函数用的是this锁

2.3静态同步函数

方法上加上static关键字,使用synchronized 关键字修饰 或者使用类.class文件。

静态的同步函数使用的锁是  该函数所属字节码文件对象

可以用 getClass方法获取,也可以用当前  类名.class 表示。

总结:

synchronized 修饰方法使用锁是当前this锁。

synchronized 修饰静态方法使用锁是当前类的字节码文件

3.多线程死锁

死锁:同步中嵌套同步,导致锁无法释放。

例如线程1拿到了a锁,等待b锁时执行任务,线程2拿到了b锁,等待a锁执行任务,这时候两个线程都占据了对方所需要的锁,而锁又是在任务完成后才会自动释放,这时候就卡住了导致死锁。

4.lock锁

lock接口提供了与synchronized关键字类似的同步功能,但需要在使用时手动获取和释放锁。

4.1 语法

Lock lock  = new ReentrantLock();
lock.lock();
try{
//可能会出现线程安全的操作
}finally{
//一定在finally中释放锁
//也不能把获取锁在try中进行,因为有可能在获取锁的时候抛出异常
  lock.ublock();
}

4.2 Lock 接口与 synchronized 关键字的区别

Lock 接口可以尝试非阻塞地获取锁 当前线程尝试获取锁。如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁。
*Lock 接口能被中断地获取锁 synchronized 不同,获取到锁的线程能够响应中断,当获取到的锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。

Lock 接口在指定的截止时间之前获取锁,如果截止时间到了依旧无法获取锁,则返回。

4.3Condition用法的用法

Condition的功能类似于在传统的线程技术中的,Object.wait()Object.notify()的功能

Condition condition = lock.newCondition();
res. condition.await();  类似wait
res. Condition. Signal() 类似notify

 

 

下一篇:并发编程----多线程(多线程通讯)三

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值