《多线程编程》学习之一:使用多线程及线程安全
2016-10-16 22:01
260 查看
1.1 进程和线程的概念
进程是受操作系统管理的基本运行单元,而线程可理解为在进程中独立运行的子任务。使用多线程技术,可在同一时间内运行不同的任务,使系统的运行效率提高。
一个运行着的程序至少有一个线程在运行,调用public static void main(String[] args)方法的线程是有JVM创建的。
1.2 使用多线程
1.2.1 继承Thread类
1)使用多线程时,代码的运行结果与代码的执行顺序是无关的:
2)执行start()方法的顺序不代表线程启动的顺序:
1.2.2 实现Runnable接口
由于java不支持多继承,当需创建的线程类已经有父类时,就不能继承Thread类了,此时需要通过实现Runnable接口。
需要注意的是Thread.java类也实现了Runnable接口,这意味着可以把一个Thread类对象传入构造函数Thread(Runnable target),也就是说可以把一个Thread类对象的run()方法教给其它线程调用。
1.3 实例变量与线程安全
1)不共享数据的情况:
2)共享数据时的情况:(多个线程访问同一个变量)
2.1)i--操作引起的线程不安全:
“非线程安全”是指多个线程对同一个对象的同一实例变量进行操作时,出现值被更改、值不同步的情况。
本例中产生非线程安全的原因是,在JVM中,i--不是原子性操作,分为三步:取得i的值 --> 计算i-1 --> 对i进行赋
值。可以在run()方法前添加synchronized关键字来实现线程安全。
2.2)另一个线程不安全的例子:
进程是受操作系统管理的基本运行单元,而线程可理解为在进程中独立运行的子任务。使用多线程技术,可在同一时间内运行不同的任务,使系统的运行效率提高。
一个运行着的程序至少有一个线程在运行,调用public static void main(String[] args)方法的线程是有JVM创建的。
1.2 使用多线程
1.2.1 继承Thread类
1)使用多线程时,代码的运行结果与代码的执行顺序是无关的:
2)执行start()方法的顺序不代表线程启动的顺序:
1.2.2 实现Runnable接口
由于java不支持多继承,当需创建的线程类已经有父类时,就不能继承Thread类了,此时需要通过实现Runnable接口。
需要注意的是Thread.java类也实现了Runnable接口,这意味着可以把一个Thread类对象传入构造函数Thread(Runnable target),也就是说可以把一个Thread类对象的run()方法教给其它线程调用。
1.3 实例变量与线程安全
1)不共享数据的情况:
2)共享数据时的情况:(多个线程访问同一个变量)
2.1)i--操作引起的线程不安全:
“非线程安全”是指多个线程对同一个对象的同一实例变量进行操作时,出现值被更改、值不同步的情况。
本例中产生非线程安全的原因是,在JVM中,i--不是原子性操作,分为三步:取得i的值 --> 计算i-1 --> 对i进行赋
值。可以在run()方法前添加synchronized关键字来实现线程安全。
2.2)另一个线程不安全的例子:
相关文章推荐
- 《多线程编程》学习之十:定时器Timer的使用,线程安全的单例模式
- 多线程学习-ListenableFuture使用介绍以及示例
- 多线程学习总结(七)——线程安全之共享变量
- 多线程学习总结(八)——线程安全之“”锁“”
- 多线程学习之多线程编程
- 多线程学习总结(九)——线程安全之线程间的通信
- 多线程学习总结(十)——线程安全之线程间的通信深入
- 在多线程中使用静态方法是否有线程安全问题
- 多线程学习总结(十一)——线程安全之线程间的通信notify和notifyAll
- 多线程学习使用(一)——仿真之银行业务系统
- 多线程学习使用(二)——仿真之饭店服务系统
- 多线程学习使用(三)——分发之汽车装配
- 《多线程编程》学习之八:方法join()的使用、类ThreadLocal的使用
- 《多线程编程》学习之九:Lock的使用
- 张孝祥[致敬]-多线程学习第02课 传统定时器的使用
- Thread多线程学习(二),java多线程中synchronize锁的使用和学习
- 在多线程中使用静态方法时候会有线程安全问题
- boost库学习随记六:使用同步定时器、异步定时器、bind、成员函数回调处理、多线程的同步处理示例等
- 在多线程中使用静态方法是否有线程安全问题
- 8.多线程学习--使用线程本地变量