Java多线程同步机制的研究分析.docVIP

  • 8
  • 0
  • 约4.15千字
  • 约 9页
  • 2018-10-11 发布于福建
  • 举报
Java多线程同步机制的研究分析

Java多线程同步机制的研究分析   摘 要:Java多线程同步机制的应用有利于提高系统资源的利用率,改善系统的安全性。但是在多线程中最重要的问题是线程的同步和共享资源的访问保护。本文通过具有意义的售票系统的并发同步实例,对同步进行了探索。   关键词:Java 多线程 同步   中图分类号:G420 文献标识码:A 文章编号:1673-9795(2014)03(a)-0183-02   至今,随着计算机技术的飞速发展和互联网的大面积普及,多处理器计算机已经司空见惯,在这种前景下,Java虚拟机(JVM)提供了一个多线程机制。在Java语言的编程设计中使用多线程运行机制来支持多任务和并行处理,可以让在同一地址空间中执行多控制流,显著的提高程序效率。但是线程的同步问题和共享资源的访问保护是非常复杂的问题。   1 线程的同步机制   多线程的应用程序中,两个或两个以上的线程可以共享同一片存储空间,这带来方便的同时,也导致线程共享资源发生冲突,此时我们可以使用Java语言提供的同步机制(又叫互斥锁机制)来解决此冲突问题。该同步机制是使用synchronized关键字控制一段程序代码,这代码段称为互斥区或临界区。定义临界区的目的是在任一时间只有一个线程使用共享资源,保证多线程的并发执行。Java语言的每个对象(即类实例)都对应一把锁(Lock),临界区使用锁来互斥多线程进入临界区。每次只有一个线程获得锁进入临界区,其它没有获得锁的线程必须在就绪队列中等待,直到该锁被释放。synchronized关键字的使用方式有synchronized方法和块两种。   (1)synchronized方法:将访问共享资源的方法都标记为synchronized,然后该标记的方法来控制对类成员变量的访问。类实例和锁是一一对应的,当获得需要调用synchronized方法的类实例锁时,synchronized方法才可以执行,而且它开始执行直到完毕为止独占锁。这时其它调用synchronized方法的线程进入阻塞,一直到获得释放锁为止。定义同步方法语法格式如下:   public synchronized void 方法名(参数列表){   …//省略代码   }   (2)synchronized块:java语言中除了使用synchronized方法来设置同步,还可以使用synchronized块来设置同步。如果使用前者来修饰一个比较大的方法时,也会锁住了不需要锁住的字段,导致程序运行效率降低。后者是把程序的某段代码使用synchronized块来修饰,跟前者比它可以减少程序的同步区域。所以我们可以使用synchronized块来修饰语句块,能够弥补synchronized方法修饰的缺陷。定义同步块的语法格式如下:   synchronized(表达式)//表达式的结果是当前对象{   …//省略代码   }   从以上两种方法能够看出,关键字synchronized用来与对象的锁联系,当某个对象使用synchronized修饰时就意味着同步机制已启动,任一时刻只有让一个线程访问临界区资源,阻止其他线程访问该对象,即使出现阻塞和死锁现象,该对象的被锁定状态也不会解除。   2 同步机制在售票系统的实现   在现实生活当中也经常遇到多个线程共享同一个数据资源,典型的例子是火车票售票系统,来讲解线程共享资源。假设在售票厅内设10个售票窗口,每个售票窗口相当于一个线程,这些线程的共同访问资源为售票厅的100张票。若不设置同步机制代码如下:   public class Ticket {   public static void main(String[] args) {   Sell_Ticket st = new Sell_Ticket();//创建10个线程,每个线程代表一个售票口   for (int i = 0; i 10; i++) new Thread(st, 第 + i + 个窗口).start();   }   }   class Sell_Ticket implements Runnable {   int trainTicket = 100;//预售的票数   boolean flag = false;//循环控制标志   public void run(){   while (!flag) {// 当还有剩余票时继续售票   sellTicket(); }   }   public void sellTicket(){   if (trainTicket 0) {   System.out.println(Thread.currentThread().getName(

文档评论(0)

1亿VIP精品文档

相关文档