11 同步方法
 synchronized – 同时解决了有序性、可见性问题
 volatile – 结果可见性问题
12 同步- synchronized
synchronized可以在任意对象上加锁,而加锁的这段代码将成为互斥区或临界区。
每个对象都可以做为锁,但一个对象做为锁时,应该被多个线程共享,这样显得有意义。
注:见code
13 一个线程执行临界区代码过程如下: 1. 获得同步锁 2. 清空工作内存 3. 从主存拷贝变量副本到工作内存 4. 对这些变量计算 5. 将变量从工作内存写回到主存 6. 释放锁
14 多线程 – 同步- synchronized
 在什么对象上加锁 ?
 代码块 : 指定的对象
 方法上 : this引用(就是说这个对象示例同一个时间只能够有1个线程访问)
 静态方法上 : class对象
15 多线程 – 同步- volatile 
 volatile : JAVA提供的一种轻量级同步工具,用于保证一个字段的可见性, 但是并不保证顺序性
 适合的场景:状态真正独立于程序内其他内容时才能使用 volatile (有一个线程发布状态)
 eg : 状态标志,边界值等
 import java.util.ArrayList;

 public class Account {
private int money; public Account(int money) {
this.money = money;
} // 方法上 : this引用
public synchronized void saveMoney(int money) {
this.money += money;
} public synchronized void getMoney(int money) {
this.money -= money;
} public synchronized void showMoney() {
System.out.println(money);
} static class SaveThread extends Thread {
Account account;
static Integer code = 100; public SaveThread(Account account) {
this.account = account;
} public void run() {
for (int i = 0; i < 50; i++) {
// 代码块 : 指定的对象
synchronized (code) {
code++;
}
account.saveMoney(1000);
System.out.println("sava i:" + i + " code:" + code);
try {
Thread.currentThread().sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < 50; i++) {
// 代码块 : 指定的对象
synchronized (code) {
code--;
}
account.getMoney(1000);
System.out.println("get i:" + i + " code:" + code);
try {
Thread.currentThread().sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} public static void main(String[] args) throws Exception {
Account account = new Account(1000);
ArrayList<SaveThread> st = new ArrayList<Account.SaveThread>();
for (int i = 0; i < 4; i++) {
st.add(new SaveThread(account));
st.get(i).start();
}
Thread.currentThread().sleep(1000);
account.showMoney();
System.out.println(st.get(0).code);
}
}

Java多线程同步方法Synchronized和volatile的更多相关文章

  1. Java 多线程之 synchronized 和 volatile 的比較

    概述 在做多线程并发处理时,常常须要对资源进行可见性訪问和相互排斥同步操作.有时候,我们可能从前辈那里得知我们须要对资源进行 volatile 或是 synchronized 关键字修饰处理.但是,我 ...

  2. 【java多线程】synchronized和volatile

    文章目录 一.synchronized 1.synchronized使用的方法 2.注意 3.不要以字符串作为锁的对象 4.`synchronized`锁的是什么? 二.volatile 1.引出问题 ...

  3. java线程安全— synchronized和volatile

    java线程安全— synchronized和volatile package threadsafe; public class TranditionalThreadSynchronized { pu ...

  4. Java多线程-同步:synchronized 和线程通信:生产者消费者模式

    大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...

  5. 四、java多线程核心技术——synchronized同步方法与synchronized同步快

    一.synchronized同步方法 论:"线程安全"与"非线程安全"是多线程的经典问题.synchronized()方法就是解决非线程安全的. 1.方法内的变 ...

  6. Java多线程:synchronized的可重入性

    从Java多线程:线程间通信之volatile与sychronized这篇文章中我们了解了synchronized的基本特性,知道了一旦有一个线程访问某个对象的synchronized修饰的方法或代码 ...

  7. java 多线程8 : synchronized锁机制 之 方法锁

    脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数 ...

  8. Java多线程编程那些事:volatile解惑--转

    http://www.infoq.com/cn/articles/java-multi-thread-volatile/ 1. 前言 volatile关键字可能是Java开发人员“熟悉而又陌生”的一个 ...

  9. JAVA多线程学习- 三:volatile关键字

    Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字. volatile,从字面上说是易变的.不稳定的,事实上,也确实如此,这个 ...

随机推荐

  1. MegaCli监控RAID磁盘健康信息

    首先有必要先介绍一下有关RAID卡的使用,有关Cache问题也有个人理解:生产系统上的物理机磁盘配置大多都是RAID5,之前会经常性的遇到磁盘IO在某个时间极度的跟不上节奏,稍微写入量,磁盘utils ...

  2. 关于css的兼容

    这篇随笔为了方便自己后期的学习和查找,用来记录平时遇到的一些问题,后期会陆续更新 1.背景图 :background-position属性,在ff下不支持该属性的拆分写法(background-pos ...

  3. 绝对定位的DIV绝对居中显示

    绝对居中:即在客户端上任何分辨率下纵横方向均居中 紫色的正方形为绝对定位的div position:absolute; top: 50%; left: 50%; 只能把div定位在以红色圈为起点的位置 ...

  4. c语言中函数的简单介绍

    c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数  int func() 3.有参 ...

  5. 2014-11-9------- 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  6. ios专题 - Scrum

    什么是Scrum? Scrum是一个敏捷开发框架,是一个增量的.迭代的开发过程.在这个框架中,整个开发过程由若干个短的迭代周期组成,一个短的迭代周期称为一个 Sprint,每个Sprint的建议长度是 ...

  7. boost::bind实践

    第一部分源码为基础实践: /*Beyond the C++ Standard Library ( An Introduction to Boost )[CN].chm*/ /*bind的用法*/ #i ...

  8. PHP Ajax简单实例

    最近学习Jquery Ajax部分,通过简单例子,比较了下post,get方法的不同 HTML部分 <html> <head> <title>jQuery Ajax ...

  9. 为SQL Server表中的列添加/修改/删除注释属性(sp_addextendedproperty、sp_updateextendedproperty、sp_dropextendedproperty)

    本篇基本完全参考:sql--sp_addextendedproperty和sp_updateextendedproperty (Transact-SQL) 三个存储过程用法一样,以sp_addexte ...

  10. javascript 学习笔记之面向对象编程(一):类的实现

    ~~想是一回事,做是一回事,写出来又是一回事~~一直以来,从事C++更多的是VC++多一些,从面向过程到面向对象的转变,让我对OO的编程思想有些偏爱,将一个客观存在的规律抽象出来总是让人比较兴奋,通过 ...