几个重要的概念:
并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。让一段程序交替进行,并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。
线程安全:经常用来描绘一段代码。指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,cpu是不是够用即可。反过来,线程不安全就意味着线程的调度顺序会影响最终结果
同步:Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全,来保证结果的准确。如上面的代码简单加入@synchronized关键字。在保证结果准确的同时,提高性能,才是优秀的程序。线程安全的优先级高于性能。 多个线程同步就意味着多个线程并发执行的时候得到的结果跟顺序执行多个线程得到的最后的结果相同。
关于成员变量与局部变量
如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的(也就是说一个线程对成员变量的改变会影响到另一个线程) 。 如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝,一个线程对该局部变量的改变不会影响到其他的线程。
public class MultThreadTest {
public static void main(String[] args) {
HelloRunnable r = new HelloRunnable();
// 使用一个对象创建了两个线程
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
// 问两种情况,如果i为成员变量,输出多少次? 10次
// 如果i为局部变量,输出多少次? 20次
t1.start();
t2.start();
}
}
class HelloRunnable implements Runnable {
int i = 0; // 如果i被定义为成员变量,那么i这个值是属于该类的一个对象的,
// 当我们用这一个对象去创建两个线程时