零、一些概念
共享变量:一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。
共享变量可见性:一个线程对共享变量值的修改,能够及时被其它线程看见。
实现的过程,线程1 将自己工作内存中的变量修改后,更新到主内存中,然后主内存将新值更新到线程2的工作内存中去。
JMM:Java 内存模型(Java Memory Model)
主内存:所有的变量都保存在主内存中。
工作内存:每个线程都有自己独立的工作内存,保存了主内存中变量的一个copy (副本)
关系图如下:
一、实现线程的两种方式
Thd1.java
public class Thd1 extends Thread {//继承Thread类创建线程
private long waitTime;
public Thd1(long wt){
this.waitTime=wt;
}
public void run(){
try {
Thread.sleep(waitTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread1");
}
}
Thd2.java
public class Thd2 implements Runnable {//实现Runnable接口来创建线程
private long waitTime;
public Thd2(long wt){
this.waitTime=wt;
}
public void run() {
System.out.println("thread2");
try {
Thread.sleep(waitTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
TestThd.java
public class TestThd {//测试类
/**
* @param args
*/
public static void main(String[] args) {
Thd1 t1=new Thd1(3000);//继承Thread 类并重写run()的线程;
t1.start();
Thd2 t2=new Thd2(3000);//实现Runable 接口 重写run()的线程
Thread t=new Thread(t2);
t.start();
/*小结:线程启动方式都为start()。所以
* 第二种实现一个线程时也要得到thread的一个实例。
* 因为只有它有start().
*本人拙见:如有错误请各位指正,谢谢!
* */
}
}
二、共享变量线程间可见性实现
线程解锁前,必须要把共享变量的最新值刷新到主内存中去。
线程加锁时,将清空工作内存中共享变量的值。从而使用共享变量时,需要从主内存中重新加载共享变量的最新值。
线程解锁前对共享变量的修改,在下次加锁时对其它线程可见。
1、synchronized 实现可见性
①:获取互斥锁
②:清空工作内存
③:从主内存中copy 共享变量的最新副本到工作内存中。
④:执行代码
⑤:将更改后的共享变量的值刷新到主内存中。
⑥:释放互斥锁
public class Account {
//共享变量
String holderName;
float amount;
/*构造方法*/
public Account(String name, float amt) {
holderName = name;
amount = amt;
}
/*存钱*/
public synchronized void deposit(float amt) {
amount += amt;
}
/*取钱*/
public synchronized void withdraw(float amt) {
amount -= amt;
}
/*查看金额*/
public float checkBalance() {
return amount;
}
}
deposit() 和 withdraw() 函数都需要这个锁来进行操作,所以当一个函数运行时,另一个函数就被阻塞。请注意, checkBalance() 未作更改,它严格来讲是一个读函数。因为 checkBalance() 未作同步处理,所以任何其他方法都不会阻塞它,它也不会阻塞任何其他方法,不管那些方法是否进行了同步处理。
2、volatile 实现可见性
3、synchronized 与 volatile 的比较
> volatile 不需要加锁,不会阻塞线程,比synchronized 轻量级,所以执行效率高一些。
> 从内存可见性角度来看,volatile 读相当于加锁,写相当于解锁。
> synchronized 可以保证原子性和可见性,volatile 只能保证可见性,不能保证原子性
不错的文章:
http://www.blogjava.net/Werther/archive/2009/07/21/287656.html
- 大小: 100.5 KB
分享到:
相关推荐
本资源“JAVA语言入门(CHM)”是一个针对初学者的Java教程,旨在帮助读者快速掌握Java编程基础。 CHM文件是Microsoft编写的HTML Help Compiler(HTML帮助文件)格式,通常用于存储电子书或技术文档。在本案例中,...
│ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...
│ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...
│ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...
通过以上知识点的学习,从 Java 入门到 Java EE 高级工程师乃至系统架构师所需掌握的各项技能和技术栈,Java 开发人员能够构建出功能强大且稳定的 Web 应用和服务。随着云计算和大数据时代的到来,对于具备分布式...
│ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...
│ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...
- **SQL语言入门**:SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言。它包括数据查询、数据定义、数据操纵等功能。 - **SQL版本说明**:虽然SQL有多个版本,但核心语法和功能保持一致。了解...
状态图——Java线程类Thread uml/activity_bug.mdl //06.活动图——Bug管理系统 uml/activity_atm.mdl //06.活动图——ATM机存取款 uml/activity_thread.mdl //06.活动图——Java线程类Thread uml/sequence_...
状态图——Java线程类Thread uml/activity_bug.mdl //06.活动图——Bug管理系统 uml/activity_atm.mdl //06.活动图——ATM机存取款 uml/activity_thread.mdl //06.活动图——Java线程类Thread uml/sequence_bug.mdl ...
状态图——Java线程类Thread uml/activity_bug.mdl //06.活动图——Bug管理系统 uml/activity_atm.mdl //06.活动图——ATM机存取款 uml/activity_thread.mdl //06.活动图——Java线程类Thread uml/sequence_bug.mdl ...
状态图——Java线程类Thread uml/activity_bug.mdl //06.活动图——Bug管理系统 uml/activity_atm.mdl //06.活动图——ATM机存取款 uml/activity_thread.mdl //06.活动图——Java线程类Thread uml/sequence_...
这包括了解和使用集合框架(如List、Map、Set),Java多线程的设计与实现,网络编程中的客户端与服务器端的建立与通信。 3. Android基础入门:学习Android平台的基础知识,包括Android环境的搭建、使用Android命令...
状态图——Java线程类Thread uml/activity_bug.mdl //06.活动图——Bug管理系统 uml/activity_atm.mdl //06.活动图——ATM机存取款 uml/activity_thread.mdl //06.活动图——Java线程类Thread uml/sequence_bug.mdl ...
状态图——Java线程类Thread uml/activity_bug.mdl //06.活动图——Bug管理系统 uml/activity_atm.mdl //06.活动图——ATM机存取款 uml/activity_thread.mdl //06.活动图——Java线程类Thread uml/sequence_bug.mdl ...
状态图——Java线程类Thread uml/activity_bug.mdl //06.活动图——Bug管理系统 uml/activity_atm.mdl //06.活动图——ATM机存取款 uml/activity_thread.mdl //06.活动图——Java线程类Thread uml/sequence_bug.mdl ...
状态图——Java线程类Thread uml/activity_bug.mdl //06.活动图——Bug管理系统 uml/activity_atm.mdl //06.活动图——ATM机存取款 uml/activity_thread.mdl //06.活动图——Java线程类Thread uml/sequence_bug.mdl ...
状态图——Java线程类Thread uml/activity_bug.mdl //06.活动图——Bug管理系统 uml/activity_atm.mdl //06.活动图——ATM机存取款 uml/activity_thread.mdl //06.活动图——Java线程类Thread uml/sequence_...