java多线程浅谈之二

        最近翻了一下一本叫做《java多线程编程实战指南》的书,本来想给自己定个计划把多线程深入起来,结果一章没看完心里投降的小白旗已经挂起来了。要么觉得概念多而且晦涩难懂,要么觉得代码很难看懂,果真还是要一定代码水平才能轻松看懂的书。但考虑到多线程在实际生活中使用范围太广了,比如在大数据处理和复杂任务的处理上,通过多个线程的并行处理将数据分解成许多块小数据处理来缩短处理时间。所以还是得咬咬牙逼迫自己多了解了解,于是我就想这本这么难的书有哪些是当下水平的我能够看的懂并用到实际当中的,之前我分享过一篇线程浅谈里面谈到了多线程数据共享带来的很多问题,比如数据不同步、死锁,其实这本书里就说了很多关于锁的问题,而且这部分相对来说偏概念,看懂还是没有问题的。

        说到锁,我们想到房门需要锁保障家的安全,在java多线程中也需要锁来保障数据的安全。书里专业说法叫保障原子性、可见性及有序性,相当于共享的数据在同一时刻只能唯一一个持有锁的线程读或者写,同时该持有线程能够拿到他前一个持有线程的最新数据,同时他的改变对下一个持有线程又是透明的。既然锁有这样的作用,所以当然是用在需要使用到共享数据来更新自己的数据和操作的方法中,即两个关联性很强的数据,同时其中一个数据又是共享数据的场景下使用。

       下面通过代码来看下两种锁-->显式锁和内部锁的用法:

       //内部锁同步,就是在方法或者代码块前加上synchronized,表示要执行这个方法的线程必须要先拿到锁,执行完代码后该锁会自动被释放,唤醒入口集中在等待申请锁的某个被BLOCKED的线程,而这里的锁资源的申请和释放其实是JVM在执行的。说白了就是由JVM决定哪个线程可以拿到锁,同时JVM也将程序执行过程中的一些错误通过异常捕获处理掉了,这样就不会出现由于错误导致锁资源持续被占用无法释放的现象。

        public synchronized 返回值类型  方法名(){};

       //显式锁是java.util.concurrent.lcoks.Lock的接口实例,ReentrantLock是该Lock接口的默认实现类,调用lock()方法获取锁,unlock()释放锁

        private final Lock lock=new ReentrantLock();

        public 返回值类型 方法名(){

                    lock.lock();

                     try{

                     return 一个值;

                    }finally{

                     lock.unlock();

           }}

  从代码实现上可以看出显式锁有更大的灵活性,它可跨方法的实现锁,同时也有自己接口下的很多方法;而内部锁优势就是简单易用了,同时资源的协调由JVM而不是我们自己敲代码去控制,这样出现锁泄露的风险会小很多。

       以上就是多线程中的一个小点,这里有个问题我想问下,既然多线程能把大数据或者复杂的任务拆分成多个规模更小的任务或者数据同时进行处理,那是不是线程拆分的越多越好?答案当然是否定的,因为线程数量的增加会增加上下文切换、线程创建与销毁、建立网络连接、争用锁等开销,当这些开销大于拆分子规模缩短的时间时那这个线程对提效就完全没有作用了,所以线程数设置为多少最合理想必也是性能工程师要考虑的范围了。

        今天的内容就到这里,下次分享再见~

      

         

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值