多线程关键字:效率(性能) 、 安全
多线程的安全问题:
多线程安全应该是第一位的,需要在保证安全的前提尽可能地提高性能
不安全原因:原子性、可见性、代码顺序性
【 原子性】:在某个环境下,不可被分割(包括被中断、造成成结果不正确等)操作(简单地说原子性就是指一个不可被中断的操作,在多个线程中一起执行的时候,一个操作一
旦开始就不会被其他线程所干扰) CPU指令执行的原子性,是否满足同一个时间点共享变量的安全性。对于代码块来说,保证代码块的原子性
对于共享变量,基本数据类型赋值操作是原子性。但不包括64位的long/double操作
经典的非原子性的单条指令:n++/n--/new Object()
【可见性】(主内存到工作内存的值拷贝)
工作内存和主内存的一致性(对于每个线程来说,这个共享变量也是不可见的),针对不同线程,不同线程上下文进行切换的时候,共享区域 堆 方法区 常量池 (主
内存)拷贝到工作内存
因为线程上下文,线程轮转的原因,每个线程有自己的工作内存(可以理解为栈,自己私有的,别的线程看不见,)
涉及到值的拷贝,线程各自修改是看不见的
保证可见性,在同步范围内执行完成之后,释放锁同时会返回到内存
【有序性】JVM和CPU对执行指令的优化——指令 重排序
对于某个线程看自己内部的代码,都是有序的,而在其他线程看来,都是无序的
DataSource ds=new MysqlDataSource()
1、分配该对象内存空间
2、对这个对象进行初始化操作
3、把这个对象赋给ds引用
注意:
开启run()方法就能顺序执行,start()就会并发执行