线程安全问题

来源:互联网 发布:加权平均图像融合算法 编辑:程序博客网 时间:2024/05/29 09:54

    线程安全问题导致的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有彻底执行完毕,此时另一个线程参与进来执行,导致共享数据的错误。

    线程安全解决办法:对多条操作共享的语句,每次只能让一个线程执行完成。在执行的过程中,其他线程不可以参与执行。

    解决方案:同步代码块。synchronized(对象) { 需要被同步的代码 };对象如锁,持有锁的线程可以同步执行。

    哪些代码需要同步:操作共享数据的代码.

    什么时候使用同步:必须有多个线程;必须多个线程使用同一把锁。

    要明确的问题:哪些代码是多线程执行的代码;哪些是线程共享数据;哪些代码是操作共享数据的。

   

package com.neutron.thread.demo;/** * 1.定义类实现Runnable接口 * 2.重写Runnable接口中的run方法,将线程要运行的代码放在该run方法中。 * 3.通过Thread类建立线程对象 * 4.将实现Runnable接口的子类对象作为实际参数传递给Thread类的构造方法中。 *   要想线程执行指定对象的run方法,那么该对象必须实现Runnable接口 * 5.调用Thread类的start方法,开启线程并且调用实现Runnable接口对象的run方法。 *  * @author zhanght * */public class Tickets implements Runnable {private int ticket = 30;@Overridepublic void run() { while (true) { synchronized(this){ if (ticket > 0) { System.out.println(Thread.currentThread().getName() + " " + ticket--); } } }}public static void main(String[] args) {Tickets t1 = new Tickets();new Thread(t1).start();new Thread(t1).start();new Thread(t1).start();}/* *  Thread-0 30Thread-0 29Thread-0 28Thread-0 27Thread-0 26Thread-1 25Thread-1 23Thread-1 22Thread-1 21Thread-1 20Thread-1 19Thread-1 18Thread-1 17Thread-1 16Thread-1 15Thread-1 14Thread-1 13Thread-1 12Thread-1 11Thread-1 10Thread-1 9Thread-1 8Thread-1 7Thread-1 6Thread-1 5Thread-1 4Thread-1 3Thread-1 2Thread-1 1Thread-0 24 */}


0 0
原创粉丝点击