编辑: 没心没肺DR 2016-02-02
线程安全问题概述 单线程程序是不会出现线程安全问题的 多线程程序,没有访问共享数组,不会产生问题 多线程访问共享的数据,会产生线程安全问题 同步代码块 卖票案列出现了线程安全问题 ?? ? ? 卖出了不存在的票和重复的票 ?? ? 解决线程安全问题的一种方案;

使用同步代码块格式 ?? ? ? synchronized(锁对象){ ?? ? 可能会出现线程安全问题的代码(访问了共享数据的代码) ?注意 ?? ? 1.

同步代码块中的锁对象,可以是任意的对象 2.但是必须保证多个线程使用的锁对象是同一个 ?? ? 3.锁对象作用 把同步代码块锁住,只让一个线程在同步代码块中执行 实现卖票案例*/ public class ShoupiaoDemo1 implements Runnable { /**定义一个多个线程共享的票源*/ private int ticket = 100;

/**创建一个锁对象**/ Object obj = new Object();

/**设置线程任务;

卖票*/ @Override public void run() { /**先判断票是否存在 if (ticket>0){ //票存在 卖票ticekt System.out.println(Thread.currentThread().getName()+"正在 卖"+ticket+"张票");

ticket--;

}*/ /**使用死循环,让卖票操作次重复执行*/ /*while(true){ *//**先判断票是否存在*//* if (ticket>0){ *//**提高安全问题出现的概率,让程序睡眠*//* try { Thread.sleep(10);

} catch (InterruptedException e) { e.printStackTrace();

} *//**票存在,卖票 ticket*//* System.out.println(Thread.currentThread().getName()+"正在 卖"+ticket+"张票");

ticket--;

*/ while (true) { /**同步代码块**/ synchronized (obj) { if (ticket > 0) { //**提高安全问题出现的概率,让程序睡眠*//* try { Thread.sleep(10);

} catch (InterruptedException e) { e.printStackTrace();

} //**票存在,卖票 ticket*//* System.out.println(Thread.currentThread().getName() + "正在卖" + ticket + "张票");

ticket--;

public?static?void?main(String[]?args)?{ ????//创建Runnable接口实现类对象 ShoupiaoDemo1?run?=?new?ShoupiaoDemo1();

????//创建Thread类对象,构造方法中传递Runnable();

????Thread?t01?=?new?Thread(run);

????Thread?t02?=?new?Thread(run);

????Thread?t03?=?new?Thread(run);

????//调用start方法开启多线程 t01.start();

????t02.start();

????t03.start();

calss?.forname 字节码的特点, 同一个类,他的字节码对象只有唯一的一个 lock.lock() lock.unlock() 使用步骤 1.在成员位置创建一个Reentrantlock对象 2.在有可能出现安全问题的代码前? 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 进程:是指一个内存中运行的应用程序. 线程:线程是进程中的一个执行单元(代码的执行路径),负 责程序的执行 程序>进程>线程 线程调度 分时调度;

所有线程轮流使用cpu,平分占用cpu的时间 抢占式调度;

优先让优先级高的线程使用CPU,如果优先级相 同,则随机选择一个线程执行. 主线程;

执行主方法的线程 单线程程序;

JAVA程序中只有一个线程 执行从main方法开始,从上到下依次执行 实现多线程的第一种方式:? ? 1.?定义类,?继承?Thread?类?2.?重写?run()?方法,?run方法内部是线程要执行的任 务?3.?创建Thread子类的对象,?调用?start()?方法启动线 程java.lang.Thread类:?表示线程.?实现了Runnable接口 ????void?start():?启动线程,?即让线程开始执行run()方法中 的代码 CPU高速随机切换(本质) 线程抢夺CPU资源 设置线程的两种方式 1.使用Thread类中的方法setName(名字) void?setName(String?name)改变线程名称,使之参数? name?相同 2.创建一个带参数的构造方法,参数传递线程的名称;

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题