java 同步锁_java线程中的同步锁和互斥锁有什么区别?

在java中,同步锁和互斥锁英文关键字都是Synchronized,没有本质上的区别,两者都包括对资源的独占,使用起来没有区别。概念上的区别是

1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,执行顺序是一个乱序,没有固定的执行顺序

2:同步是协调多个相互关联线程合作完成任务,彼此之间知道对方存在,执行顺序往往是有序的。线程通过一定的逻辑顺序占有资源,有一定的合作关系去完成任务。

由于同步锁和互斥锁在使用中没有任何区别,仅仅是因为线程的关系导致了概念上的一点点区别,所以不必深究其异同。很多教程中并没有对这两者作区分。

cbe4238cd2724d4a8de8be7b9a07f342.png

下面通过一个实例来掌握同步锁的原理和使用方法。先来执行一下如下没有加锁的代码:

public class LockDemo {    private int i = 0;    public void increaseI() {       // synchronized (this) {        for(int k=1;k<=10;k++) {  // 对i执行10次增1操作            i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;i++;i--;            i++;        }        System.out.println(Thread.currentThread().getName() + "线程,i现在的值:" + i);        //}    }    public static void main(String[] args) throws InterruptedException {        LockDemo ld = new LockDemo();        int threadNum = 1000;        MyThread[] threads = new MyThread[threadNum];        for(int i=0;i

代码预期的结果为10000。实际输出结果不到10000。

552c91c71d355e5af7549d2a2c3539c7.png

没有加互斥锁

这是因为1000个线程共享了对象ld的属性i,在访问修改i的值时,可能会出现不同步的情况。

线程的同步(互斥)正是为了防止多个线程访问一个数据对象时,对数据造成的破坏:去掉第4行和第10行的注释,给increaseI()方法加锁后,各个线程对变量i的访问就是互斥的了,就不会对数据造成无法预估的结果:输出结果为预期的10000。

b1a5c994beb0f41aaaf51fdb5d82007e.png