- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java中同步线程实现
Java中同步线程实现
[摘要] 本文介绍了线程及其运行机理,探讨了Java线程的设计方法,并就Java线程设计中的关键问题即同步线程的实现问题提出了四种解决方案。
[关键词] 线程 多线程 同步
一、线程相关概念
所谓“线程”(Thread),是“进程”中某个单一顺序的控制流。而多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信较进程简单。
多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。
多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,由此带来的线程调度、同步等问题,接下来我们就对Java中对线程设计与同步问题进行探讨。
二、线程的设计方法
创建线程主要有两种形式:一种是继承自Thread类。要创建一个线程,必须创建一个从 Thread 类导出的新类。通过覆盖 Thread的run()函数来完成有用的工作。但用户通过调用Thread的start() 函数调用run()。
例:
public class Ctest extends Thread
{
public Ctest()
{…}
public static void main(String args[])
{Ctest t1=new Ctest();
t1.start();}
public void run()
{….}
}
另一种是实现Runnable接口,此接口只有一个函数run(),它由实现此接口的类实现。
例:
public class Ctest implements Runnable
{ Thread thread1;
public Ctest()
{ thread1=new Thread(this,1);}
public static void main(String args[])
{Ctest t=new Ctest();
t.startThreads(); }
public void run()
{…}
public void startThreads()
{ thread1.start(); }
}
??种创建方式差别不大,第一种因为继承自Thread,只创建了自身对象;第二种还得创建Thread对象。但是当你想继承某一其他类时,只能用后一种方式。
三、同步线程实现
线程的创建虽然只有两种形式,但是利用这两种形式我们可以在同一进程中设计多个线程;多个线程并发执行,极大地提高的程序的运行效率。但是许多线程在执行中必须考虑与其他线程之间共享数据或协调执行状态,否则会出现冲突。
解决冲突的很好办法就是在设计中引入同步机制。在Java中每个对象都有一把锁与之对应。但Java不提供单独的lock和unlock操作。它由高层的结构隐式实现,,保证操作的对应。
synchronized语句计算一个对象引用,试图对该对象完成锁操作,并在完成锁操作前停止处理。当锁操作完成synchronized语句体得到执行;当语句体执行完毕(无论正常或异常),解锁操作自动完成。作为面向对象的语言,synchronized经常与方法连用。一种比较好的办法是,如果某个变量由一个线程赋值并由别的线程引用或赋值,那么所有对该变量的访问都必须在某个synchronized语句或方法内,具体方法如下:
(1)方法声明时使用,放在范围操作符之后,返回类型声明之前。
这时线程获得的是成员锁,即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程执行完该方法后,别的线程才能进入。
例:public synchronized void synMethod()
(2)对某一代码块使用,synchronized后跟括号,括号里是变量,一次只有一个线程进入该代码块。此时,线程获得的是成员锁。例:
public int synMethod(int a1)
{synchronized(a1
文档评论(0)