线程安全问题
2016-05-04 05:53
295 查看
线程安全问题导致的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有彻底执行完毕,此时另一个线程参与进来执行,导致共享数据的错误。
线程安全解决办法:对多条操作共享的语句,每次只能让一个线程执行完成。在执行的过程中,其他线程不可以参与执行。
解决方案:同步代码块。synchronized(对象) { 需要被同步的代码 };对象如锁,持有锁的线程可以同步执行。
哪些代码需要同步:操作共享数据的代码.
什么时候使用同步:必须有多个线程;必须多个线程使用同一把锁。
要明确的问题:哪些代码是多线程执行的代码;哪些是线程共享数据;哪些代码是操作共享数据的。
线程安全解决办法:对多条操作共享的语句,每次只能让一个线程执行完成。在执行的过程中,其他线程不可以参与执行。
解决方案:同步代码块。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; @Override public 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 30 Thread-0 29 Thread-0 28 Thread-0 27 Thread-0 26 Thread-1 25 Thread-1 23 Thread-1 22 Thread-1 21 Thread-1 20 Thread-1 19 Thread-1 18 Thread-1 17 Thread-1 16 Thread-1 15 Thread-1 14 Thread-1 13 Thread-1 12 Thread-1 11 Thread-1 10 Thread-1 9 Thread-1 8 Thread-1 7 Thread-1 6 Thread-1 5 Thread-1 4 Thread-1 3 Thread-1 2 Thread-1 1 Thread-0 24 */ }
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题
- C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
- C#控制台下测试多线程的方法
- 21天学习android开发教程之SurfaceView与多线程的混搭
- Ruby 多线程的潜力和弱点分析
- C#中WPF使用多线程调用窗体组件的方法
- C#如何对多线程、多任务管理(demo)
- C#实现多线程的Web代理服务器实例