线程安全问题

来源:互联网 发布:中国人民大学 知乎 编辑:程序博客网 时间:2024/06/09 23:12

线程并发安全问题:synchronized关键字,线程安全锁、同步监视器。

多线程在访问同一个数据时(写操作),可能会引发不安全操作。

哪个线程报错不捕获,则线程死,不影响主程序。

同步:同一时刻只能有一个执行,AB配合工作,步调一致的处理(B得到A的执行结果才能继续)。如一群人上公交车。

  异步:同一时刻能有多个执行,并发,各自干各自的。如一群人上卡车。

③synchronized可以修饰方法也可以单独作为语句块存在(同步块)。作用是限制多线程并发时同时访问该作用域。

④synchronized修饰方法后,会为方法上锁。方法就不是异步的了,而是同步的。锁的是当前对象。

    ⑤synchronized同步块:分析出只有一段代码需要上锁,则使用。效率比直接修饰方法要高。

线程安全的效率低,如VectorHashtable。线程不安全的效率高,如ArrayListHashMap

  synchronized void getMoney(int money){ if(count==0){

throw new RuntimeException("余额为0"); }

Thread.yield(); count-=money; }

  void getMoney(int money){

synchronized(this){//synchronized(Object){需要同步的代码片段}

if(count==0){  throw new RuntimeException("余额为0"); }

Thread.yield(); count-=money;    }

13Daemon后台线程也称为守护线程:当当前进程中所有”“前台线程死亡后,后台线程将被强制死亡(非自然死亡),无论是否还在运行。

守护线程,必须在启动线程前调用。

②main方法也是靠线程运行的,且是一个前台线程。

正在运行的线程都是守护线程时,JVM退出。

14wait/notify方法

这两个方法不是在线程Thread中定义的方法,这两个方法定义在Object中。两个方法的作用是用于协调线程工作的。

等待机制与锁机制密切关联:wait/notify方法必须与synchronized同时使用,谁调用waitotify方法,就锁谁!

②wait()方法:当条将不满足时,则等待。当条件满足时,等待该条件的线程将被唤醒。如:浏览器显示一个图片,displayThread要想显示图片,则必须等代下载线程downloadThread将该图片下载完毕。如果图片没有下杂完成,则dialpayThread可以暂停。当downloadThread下载完成后,再通知displayThread可以显示了,此时displayThread继续执行。

③notify()方法:随机通知、唤醒一个在当前对象身上等待的线程。

④notifyAll方法:通知、唤醒所有在当前对象身上等待的线程。

12)线程并发安全问题:synchronized关键字,线程安全锁、同步监视器。

多线程在访问同一个数据时(写操作),可能会引发不安全操作。

哪个线程报错不捕获,则线程死,不影响主程序。

同步:同一时刻只能有一个执行,AB配合工作,步调一致的处理(B得到A的执行结果才能继续)。如一群人上公交车。

  异步:同一时刻能有多个执行,并发,各自干各自的。如一群人上卡车。

③synchronized可以修饰方法也可以单独作为语句块存在(同步块)。作用是限制多线程并发时同时访问该作用域。

④synchronized修饰方法后,会为方法上锁。方法就不是异步的了,而是同步的。锁的是当前对象。

    ⑤synchronized同步块:分析出只有一段代码需要上锁,则使用。效率比直接修饰方法要高。

线程安全的效率低,如VectorHashtable。线程不安全的效率高,如ArrayListHashMap

  synchronized void getMoney(int money){ if(count==0){

throw new RuntimeException("余额为0"); }

Thread.yield(); count-=money; }

  void getMoney(int money){

synchronized(this){//synchronized(Object){需要同步的代码片段}

if(count==0){  throw new RuntimeException("余额为0"); }

Thread.yield(); count-=money;    }

Daemon后台线程也称为守护线程:当当前进程中所有”“前台线程死亡后,后台线程将被强制死亡(非自然死亡),无论是否还在运行。

守护线程,必须在启动线程前调用。

②main方法也是靠线程运行的,且是一个前台线程。

正在运行的线程都是守护线程时,JVM退出。

14wait/notify方法

这两个方法不是在线程Thread中定义的方法,这两个方法定义在Object中。两个方法的作用是用于协调线程工作的。

等待机制与锁机制密切关联:wait/notify方法必须与synchronized同时使用,谁调用waitotify方法,就锁谁!

②wait()方法:当条将不满足时,则等待。当条件满足时,等待该条件的线程将被唤醒。如:浏览器显示一个图片,displayThread要想显示图片,则必须等代下载线程downloadThread将该图片下载完毕。如果图片没有下杂完成,则dialpayThread可以暂停。当downloadThread下载完成后,再通知displayThread可以显示了,此时displayThread继续执行。

③notify()方法:随机通知、唤醒一个在当前对象身上等待的线程。

④notifyAll方法:通知、唤醒所有在当前对象身上等待的线程。

0 0