线程的三大特性

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();
		
		
		
	}

}

 

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值