初学者笔记——多线程
多线程:
Thread的继承
如何在自定义的代码中,自定义一个线程呢?
答:通过对API的查找,java已经提供了对线程这类事物的描述就是thread类。
:
创建线程的第一种方式步骤:
- 定义类继承thread
- 复写thread类中的run()方法
- 调用线程的start方法,该方法的两个作用:1)启用线程;2)调用run()方法【调用run()方法为对象名.start();】。
- 第一种方法基本没有实际价值,因为在java中类只能继承一个类【java的单继承原则】。
- 由4)可得该方法不会再实际开发中使用一般的会使用接口的形式
- 代码展示:
-------类
--------对象
创建线程的第二种方式步骤【重点掌握】:
- 继承接口Runnable
- 复习thread中的run()方法
- 创建本身类的对象
- 创建thread类对象
- 将本身对象接入thread对象中
- 调用thread对象的start方法即开启线程。
- 代码展示:
-----------类
-----------对象
- 画图表示
线程的安全问题
- 当多个线程调用一个共享数据时有可能触发线程的安全问题,例如4个线程卖一种票,将会导致有负数的出现(错误原因:在cpu处理指令时将会切换线程,那么当线程挂起共享变量之后cpu切换到其他线程后,这个其他线程将这个共享变量修改了,然而当在恢复线程时cpu操作的已经是被其他线程修改后的值了,这样就会引发多线程的安全问题,所以解决这个安全问题就是将操作共享变量的代码块封装为同步代码块)
- Java的设计者们考虑到了该安全问题,提供了synchronized(同步代码块)来解决这个安全问题
- 在这一组指令执行过程中,cpu是有可能切换线程的,如果在当前线程t1被挂起之后其他线程修改了这个对象的a属性值,那么恢复线程执行时t1线程将会覆盖其他线程已经修改过的值
解决线程安全问题的方法
- 将需要操作共享数据的代码块设置为同步代码块。代码示例:
- 将需要操作的共享数据的代码封装为一个方法。代码示例:
- 代码示例如下:
锁
- 第一,二种方法的锁为obj对象。
- 第三种方法的锁为this;
线程-关于静态及单例设计模式-安全问题
- 线程安全问题的解决方法-将操作共享数据代码加this锁,但是在静态中还试用吗?
(代码解释):
代码中所用的this锁是不对的,因为在静态进内存时,内存中不存在本类对象,但是一定有该类的字节码文件所以该为startictest1.class.
- 饿汉式在多线程中为安全的,因为它为直接赋值的;
(代码如下:)
- 饱汉式在多线程中就会引发线程安全问题,因为它需要判断(代码如下:)
- 本人能力有限,如有错误敬请谅解,