精华内容
下载资源
问答
  • newmalloc 的区别和用法 newmalloc 的区别和用法 newmalloc 的区别和用法 newmalloc 的区别和用法 newmalloc 的区别和用法 newmalloc 的区别和用法 newmalloc 的区别和用法
  • Synchronize Lock 的区别与用法

    千次阅读 2015-08-03 21:18:23
    Synchronize Lock 的区别与用法

    一、synchronized和lock的用法区别

     
    (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。
     
    (2)lock(显示锁):需要显示指定起始位置和终止位置。一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对 象才能保证锁的生效。且在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。
     

    二、synchronized和lock性能区别

     
    synchronized是托管给JVM执行的,而lock是java写的控制锁的代码。在Java1.5中,synchronize是性能低效的。因为 这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。相比之下使用Java提供的Lock对象,性能更高一些。但 是到了Java1.6,发生了变化。synchronize在语义上很清晰,可以进行很多优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致 在Java1.6上synchronize的性能并不比Lock差。
     

    三、synchronized和lock机制区别


    (1)synchronized原始采用的是CPU悲观锁机制,即线程获得的是独占锁。独占锁意味着其 他线程只能依靠阻塞来等待线程释放锁。
    (2)Lock用的是乐观锁方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就 是CAS操作(Compare and Swap)。
     
    展开全文
  • 文章主要介绍了typedef#define的用法与区别
  • 2、一文讲透日语中「は」「が」的区别!3、日语中为何用「馬鹿」来表示「笨蛋」4、精学50万字日文外刊,日文水平暴增!5、关于新冠病毒相关最新最热日语词汇大全6、20个值得你永久收藏的日语学习网站对于学日语的...

    09ec74369b26cead5c0511b62fde221f.png

    文章
    精选

    1、既有趣又能让你迅速提升涵养的四字熟语!

    2、一文讲透日语中「は」和「が」的区别!

    3、日语中为何用「馬鹿」来表示「笨蛋」

    4、精学50万字日文外刊,日文水平暴增!

    5、关于新冠病毒相关最新最热日语词汇大全

    6、20个值得你永久收藏的日语学习网站

    288e04ea5768b70b439983ba603814f0.png

    对于学日语的同学来讲「まで」「までに」的用法,是绕不开的难点,单看讲解的时候很明白,用的时候就是一个字,晕。今天我们就给大家讲一讲两者的区别。首先,「まで」和「までに」,表示“在~之前做某事”。

    1、「まで」:表示在之前的某段时间中持续发生的事情,后接持续性动作。一般翻译为某动作或状态,没有中断一直发生到某个时间为止

    比如:朝10時「まで」寝ました。

    一直睡到早上10点。睡觉这个动作一直持续到10点(如下图)

    feaedb276892030582cb019568e31663.png

    2、「までに」:表示某动作最晚完成的节点,截止点,后接一次性的动作(动词)可以翻译为在某个时间点之前,把...做好,完成。

    比如:午前10時までに書類を書いておいてください。

    请在上午10点前完成这些文件。(如下图)

    a0d1f8d892c1d426cc02e55c381a218a.png

    很多同学对于持续性动作和瞬间动作分不太清

    下面重点给大家举几个例子

    1、まで+持续性动作

    ①昨日は夜1時までずっと勉強していました。

    昨天一直学习到凌晨1點。

    勉強していました→ 持续性的动作

    ②彼は朝8時から11時まで食べ続けている。

    他从早上8点一直吃到11点。

    食べ続けている。→ 持续性的动作

    2、までに+瞬间性动作

    ①借金は明日までに返してください。

    借的钱请在明天还给我。“还”这个动作是瞬间性的。

    ②友達が来るまでに、勉強してしまおう。

    朋友来之前,请把作业完成。

    备注:一般动词+(し)終わる」「てしまう」「ておく」,可以变成瞬间性的动作。

    ◆  ◆  ◆  ◆  ◆  

    热文文章(点击即可查看)>必备200个反义词组,一篇掌握400个单词,完美!|日本男生会对女生失望的5大瞬间|日本人称呼妻子的六大表达方式!你都掌握了吗?|为什么「杜」和「森」一样也读作「もり」呢?「やばい」一词原来是这样来的!get√ 完全掌握日语各类时间的表达方式|200个容易望文生义的日文单词表示家的「いえ」 和 「うち」有什么区别?|日语基础语法100条完整版 | 初学必备|最基础的「する」竟然有这么多用法!

    备考冲刺(点击即可查看)>抢分必备!日语阅读必备短语汇总|日语N2核心副词整理汇总!这样学最高效|N1/2高频词汇总结,备考更高效!|一级231条语法详细总结,拯救你的能力考!现在学习还不晚!|日语能力考N2语法总结(很全很好)-打印版|日语考试N2必备训读动词300+ | 收藏学习|努力什么时候都不晚!170分经验谈|备考 | 200个日语N1考前必会训读词|N1备考心得:即时应答&错题本(文末附有学习资源)

    f430e362548e2320c50bd7ec839b7577.png

    展开全文
  • 主要介绍了Python中 sort sorted的用法与区别,文中通过示例代码介绍非常详细,对大家学习或者工作具有一定参考学习价值,需要朋友可以参考下
  • 本文将会对两者进行分析,记录他们的用法和区别。 CountDownLatch CountDownLatch是一个非常实用多线程控制工具类,称之为“倒计时器”,它允许一个或多个线程一直等待,直到其他线程操作执行完后再执行。 ...

    前言

    CyclicBarrier和CountDownLatch这两个工具都是在java.util.concurrent包下,并且平时很多场景都会使用到。
    本文将会对两者进行分析,记录他们的用法和区别。

    CountDownLatch

    CountDownLatch是一个非常实用的多线程控制工具类,称之为“倒计时器”,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。
    CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。
    在这里插入图片描述

    特点

    只能一次性使用(不能reset);主线程阻塞;某个线程中断将永远到不了屏障点,所有线程都会一直等待。

    例子

     	//创建初始化3个线程的线程池
        private ExecutorService                    threadPool     = Executors.newFixedThreadPool(3);
        //保存每个学生的平均成绩
        private ConcurrentHashMap<String, Integer> map            = new ConcurrentHashMap<>();
        private CountDownLatch                     countDownLatch = new CountDownLatch(3);
    
        private void count() {
            for (int i = 0; i < 3; i++) {
                threadPool.execute(() -> {
                    //计算每个学生的平均成绩,代码略()假设为60~100的随机数
                    int score = (int) (Math.random() * 40 + 60);
                    try {
                        Thread.sleep(Math.round(Math.random() * 1000));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    map.put(Thread.currentThread().getName(), score);
                    System.out.println(Thread.currentThread().getName() + "同学的平均成绩为" + score);
                    countDownLatch.countDown();
                });
            }
            this.run();
            threadPool.shutdown();
        }
    
        @Override
        public void run() {
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            int result = 0;
            Set<String> set = map.keySet();
            for (String s : set) {
                result += map.get(s);
            }
            System.out.println("三人平均成绩为:" + (result / 3) + "分");
        }
    
        public static void main(String[] args) throws InterruptedException {
            long now = System.currentTimeMillis();
            CyclicBarrier1 cb = new CyclicBarrier1();
            cb.count();
            Thread.sleep(100);
            long end = System.currentTimeMillis();
            System.out.println(end - now);
        }
    

    最终输出结果:
    在这里插入图片描述
    其中1194ms证明了会阻塞主线程。

    CyclicBarrier

    CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。

    这个屏障之所以用循环修饰,是因为在所有的线程释放彼此之后,这个屏障是可以重新使用的(reset()方法重置屏障点),这一点与CountDownLatch不同。

    CyclicBarrier是一种同步机制允许一组线程相互等待,等到所有线程都到达一个屏障点才退出await方法,它没有直接实现AQS而是借助ReentrantLock来实现的同步机制。它是可循环使用的,而CountDownLatch是一次性的,另外它体现的语义也跟CountDownLatch不同,CountDownLatch减少计数到达条件采用的是release方式,而CyclicBarrier走向屏障点(await)采用的是Acquire方式,Acquire是会阻塞的,这也实现了CyclicBarrier的另外一个特点,只要有一个线程中断那么屏障点就被打破,所有线程都将被唤醒(CyclicBarrier自己负责这部分实现,不是由AQS调度的),这样也避免了因为一个线程中断引起永远不能到达屏障点而导致其他线程一直等待。屏障点被打破的CyclicBarrier将不可再使用(会抛出BrokenBarrierException)除非执行reset操作。

    构造函数

    CyclicBarrier有两个构造函数:

    1. CyclicBarrier(int parties)
      int类型的参数表示有几个线程来参与这个屏障拦截,(拿上面的例子,即有几个人跟团旅游);
    2. CyclicBarrier(int parties,Runnable barrierAction)
      当所有线程到达一个屏障点时,优先执行barrierAction这个线程。

    最重要的一个方法:
    await();每个线程调用await(),表示我已经到达屏障点,然后当前线程被阻塞。

    例子

    	//创建初始化3个线程的线程池
        private ExecutorService                    threadPool     = Executors.newFixedThreadPool(3);
        //创建3个CyclicBarrier对象,执行完后执行当前类的run方法
        private CyclicBarrier                      cb             = new CyclicBarrier(3, this);
        //保存每个学生的平均成绩
        private ConcurrentHashMap<String, Integer> map            = new ConcurrentHashMap<>();
    
        private void count() {
            for (int i = 0; i < 3; i++) {
                threadPool.execute(() -> {
                    //计算每个学生的平均成绩,代码略()假设为60~100的随机数
                    int score = (int) (Math.random() * 40 + 60);
                    try {
                        Thread.sleep(Math.round(Math.random() * 1000));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    map.put(Thread.currentThread().getName(), score);
                    System.out.println(Thread.currentThread().getName() + "同学的平均成绩为" + score);
                    try {
                        //执行完运行await(),等待所有学生平均成绩都计算完毕
                        cb.await();
                    } catch (InterruptedException | BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                });
            }
            threadPool.shutdown();
        }
    
        @Override
        public void run() {
            int result = 0;
            Set<String> set = map.keySet();
            for (String s : set) {
                result += map.get(s);
            }
            System.out.println("三人平均成绩为:" + (result / 3) + "分");
        }
    
        public static void main(String[] args) throws InterruptedException {
            long now = System.currentTimeMillis();
            CyclicBarrier1 cb = new CyclicBarrier1();
            cb.count();
            Thread.sleep(100);
            long end = System.currentTimeMillis();
            System.out.println(end - now);
        }
    

    最终输出结果:
    在这里插入图片描述
    显然没有阻塞主线程。

    两者区别

    1. CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset()
      方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次。
    2. CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量。isBroken方法用来知道阻塞的线程是否被中断。比如以下代码执行完之后会返回true。
    3. CountDownLatch会阻塞主线程,CyclicBarrier不会阻塞主线程,只会阻塞子线程。
    4. 某线程中断CyclicBarrier会抛出异常,避免了所有线程无限等待。

    我们来从jdk作者设计的目的来看,javadoc是这么描述它们的:

    CountDownLatch: 
    A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
    
    CyclicBarrier:
    A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
    

    从javadoc的描述可以得出:

    CountDownLatch:一个或者多个线程,等待其他多个线程完成某件事情之后才能执行;
    CyclicBarrier:多个线程互相等待,直到到达同一个同步点,再继续一起执行。
    对于CountDownLatch来说,重点是“一个线程(多个线程)等待”,而其他的N个线程在完成“某件事情”之后,可以终止,也可以等待。而对于CyclicBarrier,重点是多个线程,在任意一个线程没有完成,所有的线程都必须等待。

    CountDownLatch是计数器,线程完成一个记录一个,只不过计数不是递增而是递减,而CyclicBarrier更像是一个阀门,需要所有线程都到达,阀门才能打开,然后继续执行。

    展开全文
  • 主要介绍了MySQL视图索引用法与区别详解,文中通过示例代码介绍非常详细,对大家学习或者工作具有一定参考学习价值,需要朋友们下面随着小编来一起学习学习吧
  • maymight的区别用法:1、表示许可。在表示请求、允许时,might比may语气委婉些。注意:否定回答可用can't或mustn't,表示:不可以、阻止。May I come in? Yes, you can/No, you can't(mustn't).Might I borrow ...

    may和might的区别及用法:1、表示许可。在表示请求、允许时,might比may语气委婉些。注意:否定回答可用can't或mustn't,表示:不可以、阻止。May I come in? Yes, you can/No, you can't(mustn't).Might I borrow your pen? No, you ,mustn't.2、may用于祈使句中表示祝愿。而might没有这个功能。例如:7a686964616fe59b9ee7ad9431333431343033May you live long!祝您长寿!3、表示无把握的推测,might比may的语气更加不肯定,语气较委婉(用于肯定句中,疑问句用can)。may/might+动词原形或动词的进行时表示对现在的推测;may/might+动词的完成式或完成进行式表示对过去的推测。扩展资料一、may    英[meɪ]    美[me]    aux.    可以; 会; 也许; 但愿;    n.    [May] 五月; 山楂属植物; (五朔节装饰用的) 绿枝花枝; (春天开花的) 绣线菊属植物;    [例句]We may have some rain today今天可能会下点雨。[其他]    第三人称单数:mays 现在分词:maying 过去式:might 过去分词:might    二、might    英[maɪt]    美[maɪt]    aux.    表示可能; 表示许可; 表示询问情况;    n.    力气; 力量; 威力; 权力;    v.    可以; 应该;    [例句]Smoking might be banned totally in most buildings绝大多数建筑中可能会全面禁止吸烟。[其他]    原型: may    三、might的用法1、表示允许(1) 表示请求允许(即请求别人允许自己做某事),两者都可用,只是 might 表示的语气较委婉(但并不表示过去)。如:May I come round in the morning? 我早上来行吗?(2) 表示给予允许(即自己允许别人做某事),只用能 may而不能用might。如:You may not tell him this. 你不可以告诉他这件事。2、表示推测两者都可用,只是 might 比 may 语气更不确定,表示的可能性更小(注意此时的might并不表过去)。在句型使用方面:may通常用于肯定句或否定陈述句,一般不用于疑问句(疑问句中用 can, 参见 can),而might 则可用于肯定句、否定句或疑问句。在用法方面注意以下几点:(1) 后接动词原形,表示对现在或将来的推测。如:He may [might] be in his office now. 他现在说不定在办公室里。(2) 后接动词进行式,表示动作正在进行或将要发生。如:They may [might] be going abroad next month. 他们可能在下个月出国。(3) 后接动词完成式,表示对过去可能发生的事进行推测。如:He may [might] have gone to have his hair cut. 他可能理发去了。3、 用于 may [might] (just) as well意为“不妨”“还是……为好”等,用 might 比用 may 语气更委婉。如:We may [might] (just) walk there. 我们不妨步行去。4. 正式场合或书面语中,may 可用来表示祝愿May you be happy! 祝你幸福!

    展开全文
  • 主要介绍了JavaScript中calleecaller的区别与用法,结合实例形式分析了javascript中calleecaller的功能、区别、用法及操作注意事项,需要的朋友可以参考下
  • findgrep的用法和区别 findgrep区别 find:相当于windows中搜索,用来搜索文件 grep:用来搜索文本,搜索文件内部中文字内容 find的用法 语法: 格式: find [path] [-options] [操作expression] ...
  • @RequestParam@PathVariable的用法与区别

    万次阅读 多人点赞 2018-12-13 10:14:30
    Web应用中URL通常不是一成不变,例如微博两个不同用户个人主页对应两个不同URL:http://weibo.com/user1http://weibo.com/user2。我们不能对于每一个用户都编写一个被@RequestMapping注解方法来处理其...
  • 英语易混词或词组用法区别”找到。相对于 can,could,may,might must 等情态动词而言,need dare 或 have to,be able to 等短语常被称为半情态动词,其中 need dare 既可以作为情态动词,也可以作为实义...
  • 主要介绍了jquery绑定事件 bindon的用法与区别,结合实例形式分析了jquery绑定事件 bindon基本功能、用法区别与操作注意事项,需要朋友可以参考下
  • 主要介绍了js中!!!的区别与用法,js中!的用法是比较灵活的,它除了做逻辑运算常常会用!做类型判断,可以用!与上对象来求得一个布尔值,需要的朋友可以参考下
  • synchronizedlock的用法区别 synchronized:在需要同步对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁对象。 lock:需要显示指定起始位置终止位置。一般使用...
  • 主要介绍了JS forEachmap方法的用法与区别,结合实例形式分析了forEachmap方法功能、原理、使用方法及相关操作注意事项,需要朋友可以参考下
  • 助动词shallwill的用法和区别shallwill作为助动词可以动词原形一起构成一般将来时。在过去语法中,语法学家说shall用于第一人称,will只用于第二、第三人称。现在,尤其是在口语中,will也常用于第一人称。关于...
  • 主要介绍了浅谈js中attributesAttribute的用法与区别,attributes可以获取一个对象中一个属性,attributes 属性返回指定节点属性集合,文中通过示例代码介绍非常详细,需要朋友们下面随着小编来一起学习...
  •  及物动词不及物动词的区别以及用法 区别 及物动词不及物动词的区别从是否需要宾语来分,实义动词分为及物动词不及物动词两类。 不及物动词:词典里词后标有vi(全称 intransitive verb). 的就是不及物...
  • 主要给大家介绍了关于Linux中nohup&的用法和区别的相关资料,文中通过示例代码介绍非常详细,对大家学习或者使用Linux具有一定参考学习价值,需要朋友们下面来一起学习学习吧
  • 本篇文章主要是对jQuery中delegateon的用法与区别进行了详细介绍,需要朋友可以过来参考下,希望对大家有所帮助
  • 主要给大家介绍了关于Java中equals==的用法和区别的相关资料,文中通过示例代码介绍非常详细,对大家学习或者工作具有一定参考学习价值,需要朋友们下面随着小编来一起学习学习吧
  • 今天,【BBC英语精读精听 】陪伴您第842天:以下公众号即日起双号运营【速成...连词andor在句中的用法和区别andor是初中英语常见并列连词,用于引导两个并列词、词组或句子。and基本意思是“”,...
  • java ComparableComparator的用法与区别如下:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,113
精华内容 3,245
关键字:

和与的区别与用法