╰☆把酒言欢
                               聪明出于勤奋,天才在于积累.

13.4 线程的同步

1.线程同步的原因:解决数据“访问冲突”问题。

2.临界资源:多个线程间共享的数据称为临界资源

一.互斥锁

1.一个对象用“互斥锁”标记。则同一时间只有一个线程可以访问该对象

2关键字synchronized用来与对象的互斥锁联系

3当某个对象用synchronized修饰时,表明该对象已启动“互斥锁”机制,在任一时刻只能由一个线程访问,即使该线程出现堵塞,该对象的被锁定状态也不会解除,其他线程任不能访问该对象

4 synchronized 使用方法

(1)同步代码块:用在对象前面限制一段代码的执行

                   public void push(char c){
     …
     sychronized(this){
            data[index]=c;
            index++
     }
}

(2)同步方法:用在方法声明中

A同步好处:决了线程安全问题

B同步弊端

降低了运行效率(判断锁是较为消耗资源的)

同步嵌套,容易出现死锁、

 

5死锁

      (1)原因:AB两个线程,A运行中用到B。AB共用S(共享资源),A先运行,运行后由于S锁定,只能一个线程访问,B等待S运行堵塞,A等待B运行堵塞。两个线程互相等待,都无法运行

(2)为避免死锁,就应该让线程在进入阻塞状态时尽量释放其锁定的资源,以为其他的线程提供运行的机会,可用方法:

a.           wait():被锁定的对象可以调用wait()方法,这将导致当前线程被阻塞并释放该对象的互斥锁,即解除了wait()方法当前对象的锁定状态,其他的线程就有机会访问该对象。

b.          notify():唤醒调用wait()方法后被阻塞的线程。

c.          notifyAll():唤醒所有调用wait()方法被阻塞的线程

 

(补)定时器:Timer和TimerTask

1. Timer类实现的是类似闹钟的功能,也就是定时或者每隔一定时间间隔触发一次线程。

2. 通过继承TimerTask类创建子类,使该子类获得多线程的能力,将需要多线程执行的代码书写在run方法内部,然后通过Timer类启动线程的执行

3. schedule()方法

(1)public void schedule(TimerTask task,Date time):该方法的作用是在到达time指定的时间或已经超过该时间时执行线程task。

(2)public void schedule(TimerTask task, Date firstTime, long period):在时间到达firstTime开始,每隔period毫秒就启动一次task指定的线程,这种方式会重复启动线程。

(3)public void schedule(TimerTask task,long delay)在执行schedule方法delay毫秒以后启动线程task

(4)public void schedule(TimerTask task,long delay,long period):在执行schedule方法delay毫秒以后启动线程task,然后每隔period毫秒重复启动线程task。

 

 

import java.util.*;

public class Texttimer {

    public static void main(String[] args) {

      

       Timer t=new Timer();

       MyTimerTask task=new MyTimerTask();

//  t.schedule(task,500);//过500毫秒运行

    //  t.schedule(task,new Date(2011-1900,9-1,7,11,32,20));//在某一时刻运行

       t.schedule(task,0,500);//每过500毫秒运行一次

       for(int i=0;i<10;i++){

           System.out.println("主线程"+i);}}}

 

仅供个人收藏 转载自:http://blog.csdn.net/mayouarebest8621/article/details/6755036

posted on 2012-05-11 17:55  把酒言欢  阅读(2104)  评论(0编辑  收藏  举报