大家说的多,而很多很多新手不太理解的一个线程的同步与异步,今天总结下。
一个程序一般是一个进程,而我们有时候程序要求多线程(thread)。什么是多线程呢?学习过线程的同学应该都记得 建立一个线程的两个方法,
- 第一:就是MyThread继承系统的Thread 实现run方法,在创建的时候是直接new MyThread(),然后通过调用
该线程子类的.start(),方法启动。这个有一个问题就是当你的 MyThread这个类还需要继承别的抽象类或者别的类的时候就不行了。 - 第二:就是实现Runable 接口,注意这个是接口哈,java中一个类可以实现多个接口,这点是和第一种区别之处,
也是为啥大家都推荐使用这种。也是MyThrad 实现Runable 接口的run(),调用的地方和第一种操作有点点不一样,new
Thread(new MyThread()) ,调用也一样的。
啰嗦了半天线程的操作,回归正题吧。
什么叫同步? 什么叫异步?无论同步还是异步,都必须是多线程,也就是再您的代码里使用了new Thread().
假设现在程序主线程我们叫他A ,而 你在你的代码里新建了一个线程B, 和一个线程C 。 在A中你先启动B 在启动C ,
如果当前规定线程同步,那么无论是线程A 启动B 之后必须等待B执行完毕,再往下执行。执行到C ,仍旧是需要等C执行完毕之后再回归到
主线程继续往下执行。 这个就是线程同步,他安全,但是往往用户体验不好,当B 、或者C 是一个比较耗时的操作的时候,A就一直等待,特别是
如果主线程主要是显示界面变化的线程的时候,界面在这种情况下会出现卡顿的情况。
什么叫异步呢? 我们前面提出的ABC 命名假设还是成立。
在异步机制下,当A线程中启动了B ,之后A会继续往下执行,B呢也会执行,如果CUP是分给B 那么B就在执行,分给了A ,那么A就在执行。
然后A又启动一个C线程,C也会一起排队等待分配CUP运行,如此一旦ABC 三个线程需要访问到同一段代码,特别如意混用了代码中的数据,导致安全性能问题。
到现在为止相信大家对于同步异步都有一定了解,那么在我们实际代码中怎么样让程序同步,如何又允许异步呢?
如何操作呢?
一般有四个方案,首先讲最简单的两个方法
方法同步,代码块同步
方法的同步介绍:synchronized只能标记非抽象的方法
public synchronized void oper(int x) {
}
代码块的同步介绍:
lock 是一个任意对象,一般使用this 即可
synchronized (lock) {
System.out.print("Synchronize");
System.out.println("Code");
}
接下来的这个方案是叫**
ThreadLocal
大家很可能觉得这个叫本地线程,其实他并不是一个线程,而只是线程的一个属性,每一个线程都会的。