1.原子性
即一个操作或者多个操作,要么全部执行的过程中不会被任何因素打断,要么不执行。
案例:银行转账问题;
我们在操作数据也是如此:比如i++;i+=1;这些代码在java中不具备原子性,但是在多线程中肯定会出现问题,所以我们必须要用同步或者lock这些东西来确保特性;
2.可见性(volatile)
当多个线程访问同一个变量的时候,一个线程改变了这个变量的值,其他线程能改立即看到值得变化;
若两个线程在不同的cpu,那么线程1改变了i的值还没有来得及刷新到主内存,线程2又开始使用i值,那么这个I值肯定还是以前的,线程1对变量的操作就没有可见性了;
java 的内存模型
共享内存模型就是指的是java的内存模型(简称JMM).JMM决定了一个线程对共享变量的写入时,能够对另一个线程可见,从抽象的角度来看,JMM定义了线程合主内存之间的抽象关系:线程质检的共享变量存储在主内存(main memory)中每个线程都有私有的本地内存(local memory),本地内存中存储了改线程读、写 共享变量的副本。本地内存是JMM中的抽象概念,不真实存在,他涵盖了缓存,写缓冲区,寄存器,以及其他的硬件编译器优化;
3. 有序性(join)
package com.infree.join;
/**
* 如何让main线程 最后执行 其他线程在最先执行
* @author 71076
*
*/
public class JoinTest {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 30; i++) {
System.out.println(Thread.currentThread().getName()+"---------"+i);
}
}
});
t1.start();
t1.join();
Thread t2= new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 30; i++) {
System.out.println(Thread.currentThread().getName()+"---------"+i);
}
}
});
t2.start();
t2.join();
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 30; i++) {
System.out.println(Thread.currentThread().getName()+"---------"+i);
}
}
});
t3.start();
t3.join();
}
}