关于ReentrantLock使用的疑问?

直接上代码:

import java.util.concurrent.locks.ReentrantLock;

public class MulThreadTest {
        public static int a = 0;

        ReentrantLock lock = new ReentrantLock(true);
        public void addInt(){
            lock.lock();
            a++;
            System.out.println(Thread.currentThread().getName()+"___________"+a +"_     " + lock.getHoldCount());
            lock.unlock();
        }
    public static void main(String[] args) throws InterruptedException {
            for(int i=0;i<3;i++){
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        MulThreadTest test = new MulThreadTest();
                        for(int j=0;j<100;j++)
                            test.addInt();
                    }
                },"thread"+i).start();
            }
        }
     }

运行结果总会丢数字,难道是使用方法有问题?帮忙解答一下~

0

2个回答

你在每个线程里都建立了不同的text,也就是有三个不同的a在三个不同的test的实例里,这样改就可以了,三个线程访问的是同一个test实例,addInt也是针对同一个a,这样输出就可以看出lock的作用了


import java.util.concurrent.locks.ReentrantLock;

public class MulThreadTest {
        public static int a = 0;

        ReentrantLock lock = new ReentrantLock(true);
        public void addInt(){
            lock.lock();
            a++;
            System.out.println(Thread.currentThread().getName()+"___________"+a +"_     " + lock.getHoldCount());
            lock.unlock();
        }
    public static void main(String[] args) throws InterruptedException {
            final MulThreadTest test = new MulThreadTest();
            for(int i=0;i<3;i++){
                new Thread(new Runnable() {
                    @Override
                    public void run() {

                        for(int j=0;j<100;j++)
                            test.addInt();
                    }
                },"thread"+i).start();
            }
        }
     }
1
u013596119
DarthHaric 每个线程访问自己的对象就不存在synchronized的问题了
3 年多之前 回复
u013596119
DarthHaric 你new出来的是整个MulThreadTest,每个对象都有自己的a,a只是每个MulThreadTest实例的一个变量,我的代码里是只有一个对象,三个线程同时访问这一个对象的a,你的代码里是多个test,每个线程访问自己的test对象
3 年多之前 回复
zfy1355
~丹凤朝阳~ a是静态变量,new出的每一个对象都是共享a对象的,所以不存在多个a对象的
3 年多之前 回复

锁同步是针对共享数据的,多线程对共享变量访问时,会涉及到数据竞争问题。
你的代码的问题是每个线程中都新new了一个MulThreadTest对象,单线程中访问各自的数据,就不存在互斥访问的问题了。
就好比每个人家都有WC,每个人访问的是自己家的WC,那么就不可能存在竞争等待问题。但是如果是公共区域,共享的WC,那么就需要锁同步了。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
谁的锁,锁的谁--关于synchronized、ReentrantLock的正确解锁姿势
线程安全是并发编程中的一个重大关注点,所谓线程安全就是要保证在多个线程间读写共享数据保证正确性,如果不能保证,那就不是线程安全的了。 synchronized、ReentrantLock都是用来实现线程间同步,访问同步的代码需要先获得锁,保证每次都只能有一个线程进入同步块,代码执行完毕后释放锁,从而保证了线程间的安全。 所以在实现线程安全中需要考虑的核心问题就是“谁的锁,锁的谁”,只要记住这条规则,就大体上能够达
ReentrantLock(二):正确使用Condition实现等待与通知
关键字synchronized与wait()和notify()/notifyAll()方法相结合可以实现等待/通知模式。 类ReentrantLock同样可以实现该功能,但是要借助于Condition对象。它具有更好的灵活性,比如可以实现多路通知功能,也就是在一个Lock对象里面可以创建多个Condition(对象监视器)实例,线程对象可以注册在指定Condition中,从而有选择性的进行线程通知
Netty的深入浅出--71.NIO中Directbuffer与Heapbuffer的疑问(知乎)
知乎上问题描述 当传入的bytebuffer不是directbuffer的时候就会通过getTemporaryDirectBuffer()方法从操作系统中申请一块缓存。
Lock ReentrantLock 示例,解决 虚假唤醒
Lock ReentrantLock 示例,解决 虚假唤醒
大数据疑问总结
1.Storm与Flink怎样写出符合并发的程序?静态与动态,不变缓存的尽量加载一次; 2.封装与模块化思想?类与方法?示例,一次编写,到处运行(过滤港口和锚地代码); 3.对象序列化?storm与flink中的区别,各个-组件之间的序列化问题;【各个算子是否需要序列化,怎样避免序列化】 4.内存中怎样减少FullGC,对象复用; 5.Flink中初始化几次,开启并发的情况呢,放在A: prepa...
【JAVA】ReentrantLock使用方法
                                                   ReentrantLock学习 1、基本的使用,synchronized对象锁: 测试1: import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public cl...
ReentrantLock使用场景以及注意事项
import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; /** * @author FanShukui * @version 2018/4/21 18:01 */ public class ReentrantLockTest { public static Reen...
Synchronized与ReentrantLock比较以及ReentrantLock使用场景以及注意事项
锁的实现 Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现。可重入性,两者都是同一个线程每进入一次,锁的计数器自增1,所以要等到锁的计数器下降为0时才能释放锁。 功能方面 便利性:Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放。ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好...
what、which的疑问代词_18
今天我们要讲一讲疑问词,它们会让你知道如何用英语来提问。 我们来看看所有的疑问词: What           Where Which         Why How            When Who            疑问词非常重要、非常有用而且使用非常简单。它们用来组成那些表明想获得何种信息的问句。 这次,我们将重点放在&quot;what&quot;和&quot;which&quot;上面。 当存在...
多线程中ReentrantLock的使用
多线程中ReentrantLock的使用 一.使用ReentrantLock类     在java多线程中,可以使用synchronized关键字来实现线程之间同步互斥,但在jdk1.5中新增了ReentrantLock类也能达到同样的效果,并且在扩展功能上也更加强大,比如具有嗅探锁定,多路分支通知等功能,而且在使用上也比synchronized更加灵活。 1.1使用ReentrantLoc
可重入锁:ReentrantLock理解使用
(一)可重入性 可重入性描述这样的一个问题:一个线程在持有一个锁的时候,它内部能否再次(多次)申请该锁。如果一个线程已经获得了锁,其内部还可以多次申请该锁成功。那么我们就称该锁为可重入锁。通过以下伪代码说明: void methodA(){ lock.lock(); // 获取锁 methodB(); lock.unlock() // 释放锁 } void met...
Java - 可重入锁ReentrantLock简单用法
Java - 可重入锁ReentrantLock简单用法 Java 中显示锁的借口和类主要位于java.util.concurrent.locks下,其主要的接口和类有: 锁接口Lock,其主要实现为ReentrantLock 读写锁接口ReadWriteLock,其主要实现为ReentrantReadWriteLock 一、接口Lock 其中显示锁Lock的定义为: p...
Synchronized与ReentrantLock区别总结(简单粗暴,一目了然)
这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍。 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高...
Thread详解13:ReentrantLock的用法(一)
Java里面提供了比synchronized更加灵活丰富的锁机制,它们有一个共同的接口Lock,我们先来学习这个接口,了解其协议和功能。下面是JDK文档,总结得非常精炼,包含的知识点非常多,所以一开始可能看不懂,不过没关系,后面一点点弄懂。public interface LockLock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具
并发编程面试必备:synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
看本文之前,推荐给大家一个阿里云双11活动,真的非常非常非常推荐,对于新人阿里云真的是下血本了,建议阿里云新人一定一定一定不要错过。如果觉得这单纯是广告的话,你可以直接跳过看正文。 阿里云双11最新活动(仅限阿里云新用户购买,老用户拉新用户可以获得返现红包,后续有机会平分百万红包),优惠力度非常非常非常大,另外加入拼团,后续还有机会平分100w红包!目前我的战队已经有12位新人了,现在是折上5折...
java多线程学习之ReentrantLock
package learn.thread;import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;/* ReentrantLock,比synchronized轻量灵活强大的锁 */ public class Demo13 extends Thread { @Override
Lock、ReentrantLock实现生产者,消费者的面试题
package com.aop8.proAndcum; import java.util.Random; import java.util.Vector; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock...
关于专升本的一些问题
1.什么是专升本专升本是专科升入本科的一门考试2.专升本报名时间及考试时间报名时间:一般为大三下学期的4月底考试时间:一般为大三下学期的5月底注意:报名一定要保证学校扣费的那张银行卡有足够的money,不然也会报名失败。3.专升本有加分项目吗?专升本一般加分项目主要为英语四六级,国家证书,计算机二级(除计算机专业)。有相同类型的加分项,加分选取最高分  四...
ReentrantLock的使用-高并发
1.  * 使用ReentrantLock可以代替Synchronized  * 需注意:必须手动释放锁(重要!!!!)  * 使用synchronized如果遇到异常,jvm会自动释放锁  * 当时lock会手动释放锁,因此经常在finally中进行锁的释放 2.  * 与Synchronized区别:  * 使用ReentrantLock可以进行尝试锁定 tryLock()  * 这样无...
ReentrantLock,实现3个线程按顺序打印数字
public class ReentrantLockTest { private static Integer nowCnt = 0; static class Thread1 extends Thread { private ReentrantLock lock ; private Condition condition1;
java 使用单例模式(饿汉)和ReentrantLock实现线程安全
这里写了一个使ReentrantLock(可重入锁)实现线程安全的小例子class myLock implements Runnable { @Override public void run() { LockService lock = new LockService(); lock.add(); }}class LockService { ArrayList&amp;lt;Integer&amp;gt; ...
ReentrantLock使用和原理(AQS简述)
在开发过程中,synchronized是最简单的同步控制方法,在通常情况下是够用的,但synchronized时不响应中断,而且有时候,我们需要灵活的来控制加解锁。这时候可以使用ReentrantLock。 在以前的版本中,synchronized效率是远远低于ReentrantLock,后来经过优化,两者性能差距不大了。但ReentrantLock有一些新特性,是synchronized所不具...
详解ReentrantLock---公平锁与非公平锁
ReentrantLock的作用是实现代码段的并发访问,它没有直接使用锁,而是一个普通的类实现锁的定义。它提供了可轮询的锁请求,可以规避死锁的发生。 一般情况下,它的性能比synchronized好,它的功能也更全面。提供了condition,对线程的等待和唤醒更灵活,而且可以同时持有多个condition,扩展性更好。ReentractLock中持有一个sync(AQS)锁,sync有2种实现:
ReentrantLock控制线程池
webmagic每次在爬取一个网页时都会将他丢到线程池中的线程去处理,线程池有相应的大小阀值,其中用到了ReentrantLock 重入锁机制控,在超出阀值后等待,防止过多的任务进入 将目标url(request)放入线程池中执行 final Request requestFinal = request; threadPool.execute
ReentrantLock中中断锁和非中断锁源码分析
最近读了Java并发编程的艺术记录一下 https://www.cnblogs.com/daydaynobug/p/6752837.html 关于AQS的讲解 尝试获取一个内部锁的操作(进入一个 synchronized 块)是不能被中断的 public class WriterReader { private Object lock; public WriterReader...
ReentrantLock笔记(一) -- 基本使用
ReentranLock基本使用 交替输出 ReentrantLock lock = new ReentrantLock(true);//true为公平锁,false或缺省为非公平锁 Runnable r = () -&amp;amp;amp;amp;gt; { while (!Thread.currentThread().isInterrupted()) { lock.lock(); ...
重入锁ReentrantLock+Condition 实现等待/通知
        在Java多线程编程中,可以使用Synchronized来实现同步,可以synchronized类,方法或代码块,另外还可以使用ReentrantLock来实现同样的功能,而且功能更加强大。        1. 使用ReentrantLock实现同步public class ReentrantLockTest { private Lock lock = new Reent...
重入锁ReentrantLock常用方法(一)
        重入锁ReentrantLock常用方法        1. int getHoldCount()             Queries the number of holds on this lock by the current thread.            查询当前线程保持此锁定的个数,即调用lock()方法的次数。public class ReentrantLoc...
代码浅析 Android Lock 、ReentrantLock线程锁及其作用
先来了解什么是“互斥锁”? 百度一下,解释如下:在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。 是的,面对高并发的读、写访问,可能会出现数据丢失的问题,而Andriod系统基于Linux内核,使得并发读、写数据可以没有限制的进行。因此,出于对数据,尤其是共享数据的完整性和一致性
多线程(3)——ReentrantLock的公平锁与非公平锁
什么是公平锁和非公平锁 公平锁(Fair):加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得 非公平锁(Nonfair):加锁时不考虑排队等待问题,直接尝试获取锁,获取不到自动到队尾等待 怎样设置公平锁和非公平锁 先看一下源码 //定义成final型的成员变量,在构造方法中进行初始化 private final Sync sync; //无参数默认非公平锁 pub...
ReentrantLock的四种加锁方式
ReentrantLock的四种加锁方式
synchronized与ReentrantLock的介绍、使用、适合场景及比较
JDK 5.0为开发人员开发高性能的并发应用程序提供了一些很有效的新选择,目前存在两种锁机制:synchronized和Lock,Lock接口及其 实现类是JDK5增加的内容,ReentrantLock是Lock的实现。在实际的工作中,大家对synchronized和ReentrantLock都使用的比较多, 今天对这 两种锁机制进行了总结并分享给各位朋友们,希望对大家有所帮助。
彻底理解ReentrantLock
1. ReentrantLock的介绍 ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性(关于synchronized可以看这篇文章),synchronized通过获取自增,释放自减的方式实现重入。与此同时,R...
java-ReentrantLock(重入锁)+Condition-解决生产者,消费者模型
说在前面的话:此篇实质是为了探讨ReentrantLock+Condition的应用场景,借用生产者消费者模型来解释。 重点实现线程间通信 juc之ReentrantLock+Condition,await、signal方法(对比)synchronized+Object的wait、notify。 ReentrantLock对比snchronized ReentrantLock支持公平锁和非...
JAVA多线程1——ReentrantLock与synchronized的区别和适用场景
首先说明可重入锁的概念,即一个线程尝试去获取自己已经持有的锁,可以成功获取,而其他线程不可以获取。这样做的优点简而言之是——递归无阻塞的同步机制。若锁不是可重入的,在子类的同步方法中调用父类的同步方法,会无法第二次获取子对象的锁,导致死锁。
ReentrantLock类中的方法
ReentrantLock类中的方法 ReentrantLock类中有很多的方法: getHoldCount():当前线程调用 lock() 方法的次数 getQueueLength():当前正在等待获取 Lock 锁的线程的估计数 getWaitQueueLength(Condition condition):当前正在等待状态的线程的估计数,需要传入 Condition 对象 hasWaite...
ReentrantLock 解锁注意事项
学习笔记,欢迎指点:  ReentrantLock相比于synchronized,有更强大有丰富的功能扩展,单机项目推荐使用,这里不多做介绍,下面说一下我在项目中遇到的一种问题:正常逻辑下, public class TestThread implements Runnable{ private static ReentrantLock rLock = new ReentrantLock(...
Synchronized,ReentrantLock的实现原理及异同比较 、Java中其他锁的理解
1)Synchronized 同步锁 作用域:不同加锁方式对应不同作用域 1) 对象锁 当一个对象访问Synchronized方法时,锁类型为对象锁。 此时该对象不能同时访问类中其他Synchronized方法。若一个对象中有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,则其它线程不能同时访问这个对象中任何一个synchronized方法。 此外,不...
java之ReentrantLock公平锁和非公平锁
大多数情况下,大家可能都会选择使用synchronized来加锁,ReentrantLock确实是一种高级加锁工具,在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。 以下实现公平锁和非公平锁,公平锁在性能上会多消耗点 package com.cmcc.web.test.lock; import java.util
Lock源码解析
ReentrantLock  锁分为公平锁和非公平锁,公平锁是指线程在获取锁的时候是暗战线程请求获取的顺序来发放锁,先申请的先获取,后申请的后获取,跟FIFO队列的原理一直。非公平锁是指在获取锁的时候是随机的,谁抢到就发给谁。 公平锁获取锁方式 protected final boolean tryAcquire(int acquires) { final Thre