摘 要:本文分析并描述了Java多线程访问控制的基本方法和多线程同步访问的控制方法,以及使用优先级解决死锁问题的方法,并且用简单语句作说明。
关键词:Java;多线程;同步控制
中图分类号:TP312
1 Java多线程的基本控制
在Java中,一个线程从创建到死亡称为线程的一个生命周期,它的生命周期有多个不同状态,一般为:Enabled、Running、Sleeping、Joining、Waiting、Locking。对于线程的这些状态,Java在Thread类中定义了一些方法可以在程序中手动控制。要结束一个线程的运行,可以使用stop()方法。但是stop()方法并不是非常安全的,它会强制中止一个线程的运行,但是会释放这个线程锁住的所有对象,这些对象被解锁后就可能被其他的线程直接访问,导致错误的结果。因此,要中止一个线程,最好是设置一个标志位,在run()方法中根据这个标记来判断是否继续保持状态。要中止线程的时候,可以使用setRunFlag()方法。
在暂停和恢复线程执行时也会出现同样的问题。可以使用Thread类中supspend()和resume()方法來暂停和恢复,但不建议使用,它们容易造成线程的死锁。解决的方法也是使用一定的标志变量。使用setsuspendFlag(true)可以暂停线程的执行,暂停时间的指定是通过sleep()方法来实现,暂停结束就回到等待队列,不是恢复执行状态。所以sleep()方法不能精确控制线程计划工作的时间尺度。
下面用模拟一个龟兔接力跑的实例来演示Java多线程的sleep()方法的控制。模拟的接力跑中有一只乌龟和一只兔子。当兔子跑完400米将接力棒交给乌龟,乌龟跑完400米后结束。部分代码如下:
2 Java多线程的同步控制
多线程程序中,多个线程可以共享相同资源,这可能导致冲突。Java使用同步机制来解决这个问题。这个同步机制使用synchronized关键字,它主要用于多线程共享数据的同步,使用加锁的机制,控制变量或代码块在某个时间段只能被一个线程访问。
Java中synchronized既可作为方法的修饰符,锁住方法,也可在方法内部锁住部分语句。Synchronized方法和synchronized代码块在使用时是有区别的。将访问共享数据的方法加上synchronized,例如把synchronized当作方法修饰符:
Public synchronized void m1(){……}
这就是同步方法。当某个线程调用这个同步方法时,会开始执行直到完毕为止,其它想要调用这个方法的线程会进入阻塞状态,一直到这个方法获得释放为止。使用synchronized来修饰一个比较大的方法时,也会锁住其它一些不需要锁住的数据,导致程序效率下降。Synchronized块则是把方法内的某段代码使用synchronized来修饰,可以减少同步范围。例如:Public void m1(){ …… Synchronized(so){ …… }}
使用synchronized修饰时,就代表着同步机制启动,某个时刻只能某个线程访问数据和资源,阻止其它线程访问,这种状态即使出现阻塞和死锁现象也不会解除。
3 Java多线程的死锁问题
为了控制资源的访问冲突,需要使用synchronized对访问资源进行加锁,但加锁会带来一个潜在的危险:死锁。如果两个或两个以上的线程在等待两个或两个以上的锁被释放,但实际上这些锁根本就不会被解锁,那么这些线程就会进入无限等待的状态,称之为死锁。线程等待解锁的这种状态有时也被称作堵塞。死锁例子部分代码如下:
4 Java多线程的优先级
在多线程编程中要预防死锁的发生,不然死锁后会导致浪费大量时间和资源。防止死锁的方法很多,最重要的就是防止循环等待的发生。可以使用设置线程的优先级来解决这一问题。同一时刻会有很多在排队等待资源的线程,它们各自的重要性是不同的。可以赋予每个线程不同的优先级,让任务更急的线程获得更高的优先级,更快的进入执行状态。
Java中提供了10个等级的线程优先级,最低为1,最高为10,默认优先级为5。对于一个新创建的线程,如果没有指定优先级,它的优先级将和它的父线程优先级一致。使用setPriority()方法可以为线程指定优先级。
例如:int newPrio=Thread.currentThread( ).getPriority( )+1;
Thread.currentThread( ).setPriority(newPrio);
5 结束语
Java多线程编程可以合理的调用多项任务,功能非常强大。但是多线程共享数据或资源时会导致执行的错误,因此多线程访问控制管理机制在解决数据不一致性、资源冲突等问题时是非常有用的。高质量的使用Java多线程访问控制管理机制可以提高程序运行效率,缩短任务执行的时间。
参考文献:
[1]明日科技.Java从入门到精通(3版)[M].北京:清华大学出版社,2013.
[2]路勇.Java多线程同步问题分析[J].软件,2012(04):31-33.
作者简介:梁德华(1977-),男,江西瑞昌人,华中科技大学软件工程硕士,讲师,研究方向:软件工程、软件技术教学。
作者单位:江西旅游商贸职业学院 艺术传媒与计算机分院,南昌 330100