线程同步的几种方法

为什么要同步线程 ?

大家在使用线程的时候,有没有发现这样一个问题:如果涉及到多个线程对同一个变量进行操控,会时常抛出这样一个错误:java.lang.NullPointException(空指针异常)或者java.lang.ArrayIndexOutOfBoundsException(数组越界)。产生这个问题的原因是线程不同步引起的。Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时,将会导致数据不准确,相互之间产生冲突,因此,实现线程同步以避免在该线程没有完成操作之前,被其他线程调用,从而保证了该变量的唯一性和准确性。

实现线程同步的方法

一、synchronized关键字

  1. Synchronized修饰整个方法
例:
public synchronized void set(){}
  1. synchronized修饰具体的代码块
public void save(){

synchronized (this){
  count += money
}
}

二、Lock

小编认为Lock与Synchronized比较起来,Lock的优点还是比较多的。

如果一个代码块被synchronized关键字修饰,当一个线程执行该代码块时,其他的线程便只能一直等待直到占有锁的线程释放锁。那么,什么情况下占有锁的线程会释放锁呢 ?

  • 占有锁的线程执行完了该代码块,然后释放。
  • 占有锁的线程执行发生了异常,此时JVM会让线程自动释放锁。
  • 占有锁的线程进入waiting状态从而释放锁,

既然synchronized如此方便,可以轻松实现对资源的同步互斥访问。那么,为什么还需要Lock呢 ?考虑以下3种情况:

Case 1:
在使用synchronized关键字时,假如占有锁的线程由于要等待IO或者其他原因(比如调用sleep()方法)被阻塞了,但是又没有使释放锁,那么其他的线程就只能一直等待。

Case 2:
多个线程读写文件时,读和写操作会发生冲突,写和写操作也会发生冲突,但是,读和读操作不会发生冲突。所以使用synchronized关键字就会导致一个问题:无法实现多个线程同步进行读操作。这就会极大的影响程序的执行效率。

Case 3:
我们可以通过Lock得知线程有没有成功获取锁,但是synchronized无法做到。

以上三个Case中所描述的问题,Lock都可以解决,现在知道为什么会有Lock 这个东西了吧哈哈!

下面我们简单来说一下使用Lock实现线程同步的方法:
lock.lock() 加锁;lock.unlock() 释放锁。

public class Count{
Lock lock = new ReentrantLock();
public void save(){
for(int i=0;i<10;i++)
{ count++;
System.out.println("count:"+count);
}
lock.unlock();
}
}

三、volatile关键字

  1. volatile是变量修饰符,其修饰的变量具有可见性。

可见性就是说一旦某个线程修改了被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取的时候,可以立即获取修改之后的值。

在Java中为了加快程序的运行效率,对一些变量的操作通常是在该线程的寄存器或CPU缓存上进行的,之后才会同步到主存中,而加了volatile修饰符的变量则是直接读写主存。
  1. volatile可以禁止指令重排

指令重排是指编译器或者CPU为了提高程序的运行效率,可能会对输入的代码进行优化,它不保证各个语句的执行顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码中的执行结果是一致的,应用条件是单线程条件,对于并发多线程的场景下,指令重排会产生不确定的结果。

**总结:**以上就是关于线程同步的方法,本文简单的介绍了他们的各自的局限与优点,关于线程同步更详尽的内容,将放在以后的博客中。

可承接各种项目,有意者加QQ:1217898975

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

steven_moyu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值