在java项目中如何实现同步线程-创新互联
创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
为沈阳等地区用户提供了全套网页设计制作服务,及沈阳网站建设行业解决方案。主营业务为网站设计、成都做网站、沈阳网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!这期内容当中小编将会给大家带来有关在java项目中如何实现同步线程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
java 线程同步
概要:
为了加快代码的运行速度,我们采用了多线程的方法。并行的执行确实让代码变得更加高效,但随之而来的问题是,有很多个线程在程序中同时运行,如果它们同时的去修改一个对象,很可能会造成讹误的情况,这个时候我们需要用一种同步的机制来管理这些线程。
(一)竞争条件
记得操作系统中,让我印象很深的有一张图。上面画的是一块块进程,在这些进程里面分了几个线程,所有这些线程齐刷刷统一的指向进程的资源。Java中也是如此,资源会在线程间共享而不是每个线程都有一份独立的资源。在这种共享的情况下,很有可能有多个线程同时在访问一个资源,这种现象我们叫做竞争条件。
在一个银行系统中,每个线程分别管理一个账户,这些线程可能会进行转账的操作。
在一个线程进行操作的时候,他首先,会把账户余额存放到寄存器中,第二步,它将寄存器中的数字减少要转出的钱数,第三步,它将结果写回余额中。
问题在于,这个线程在执行完1、2步时,另外一个线程被唤醒并且修改了第一个线程的账户余额值,但是这个时候第一个线程并不知情。第一个线程等待第二个线程执行完毕后,继续他的第三步:将结果写回余额中。这个时候,它把第二个线程的操作刷掉了,所以整个的系统的总钱数肯定会发成错误。
这就是java竞争条件发生的不良情况。
(二)ReentrantLock类
上面的例子告诉我们,如果我们的操作不是原子操作,被打断是肯定会发生的,即使有的时候概率真的非常小,但是也并不能排除这种情况。我们不能把我们的代码变成像操作系统中的原子操作,我们能做的是为我们的代码上锁来保证安全性。在并发程序中,如果我们想要访问数据,在这之前我们先给我们的代码套一个锁,在我们使用锁的期间,我们的代码中涉及的资源就像是被”锁上了“一样,不能被其他的线程访问,知道我们打开这个锁。
在java中,synchronized关键字和ReentrantLock类都有这种锁的功能。我们在这里首先一起来讨论一下ReentrantLcok的功能。
1.ReentrantLock构造器
在这个类中,提供了两个构造器,一个是默认构造器,没什么好说的,一个是带有公平策略的构造器。这个公平策略首先他比正常的锁要慢很多,其次在有的情况下他并不是真正公平的。而且如果我们没有特殊的理由真的需要公平策略的时候,尽量不要去研究这个策略。
2.获取与释放
ReentrantLock myLock = new ReentrantLock(); //创建对象 myLock.lock(); //获取锁 try{ ... } finally{ myLock.unlock(); //释放锁 }
网站题目:在java项目中如何实现同步线程-创新互联
文章源于:http://scyanting.com/article/ppepi.html