线程同步

  *  异步编程模型和同步编程模拟的区别?

     - 有T1和T2 两个线程

     > 异步编程模型:T1线程执行T1的,T2线程执行T2的,谁也不等谁

     > 同步编程模型:T1和T2 线程执行,当T1线程必须等T2线程执行结束后才能执行,这是同步编程模型
  • 什么时候需要同步?

    • 为了数据的安全 例如:同一银行卡同时取款

    尽管降低了应用程序的效率,但是有时候为了保证数据是安全的必须加入同步机制.

    线程同步机制使程序(等同)变成了单线程。

  • 线程同步需要哪些条件?

    • 必须是多线程环境
    • 多线程环境共享同一个数据
    • 共享的数据涉及到修改操作
  • 使用线程同步机制,保护数据安全

    • 使用 synchronized(共享对象) {

      把需要同步的代码放到该同步语句块中

      }

* synchronized 的原理?

      > t1线程执行中遇到了synchronized 关键字,就回去找synchronized中的共享对象所持有的对象锁(每个对象都有对象锁有0和1两个值),如果找到了该对象的对象锁,则进入同步语句块中执行程序,当同步语句块中的
代码执行结束之后,t1线程会归还对象锁。 > 在t1线程执行同步语句块的过程中,如果t2线程也过来执行,也遇到了synchronized关键字,所以也会去找synchronized中共享对象的对象锁,但是此时该对象锁正在被t1使用,所提t2线程只能在此等候t1线程归还
对象锁之后才能拿到对象锁进入同步语句块执行代码。 - synchronized也**可以**加到成员方法上 public synchronized void withdrow(double money) {}
  • 代码实例


    //线程的同步异步
    public class ThreadTest11 {
    public static void main(String[] args) { //创建一个账户
    Account account=new Account("608521478",5000); //创建线程
    Processor_11 processor_11=new Processor_11(account); // 将同一个账户传进去 Thread thread1=new Thread(processor_11);
    Thread thread2=new Thread(processor_11); //启动线程
    thread1.start();
    thread2.start(); } }

//线程类
class Processor_11 implements Runnable{ //创建成员变量 账户
Account act; //构造方法
Processor_11(){}
Processor_11(Account act){
this.act=act;
} // 重写run方法
@Override
public void run() {
act.withDraw(1000);
}
} //银行 账户类
class Account{ //属性
private String actNo;
private double balance; //构造方法
public Account(){}
public Account (String actNo,double balance){
this.actNo=actNo;
this.balance=balance; } //getter and setter方法 public String getActNo() {
return actNo;
} public void setActNo(String actNo) {
this.actNo = actNo;
} public double getBalance() {
return balance;
} public void setBalance(double balance) {
this.balance = balance;
} //取款的方法
public void withDraw(double money){ //对当前账户进行取款操作 //把需要同步的代码,放到同步语句块中
synchronized (this){ //取款后的余额
double after=balance-money; //更新余额
this.setBalance(after); System.out.println("取款1000成功,余额为:"+this.getBalance()+"元");
} }
}

Day13_71_线程同步(synchronized)的更多相关文章

  1. Java线程(二):线程同步synchronized和volatile

    上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程 ...

  2. 线程同步 synchronized 同步代码块 同步方法 同步锁

    一 同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块.其语法如下: synchronized(obj){ // ...

  3. [03] 线程同步 synchronized

    1.线程同步概述 线程之间有可能共享一些资源,比如内存.文件.数据库等.多个线程同时读写同一份共享资源时,就可能引起冲突,所以引入了线程的"同步"机制. 所谓同步,就是说线程要有先 ...

  4. 线程同步synchronized,wait,notifyAll 测试示例

    https://www.cnblogs.com/LipeiNet/p/6475851.html 一  synchronized synchronized中文解释是同步,那么什么是同步呢,解释就是程序中 ...

  5. 线程同步synchronized和ReentrantLock

    一.线程同步问题的产生及解决方案 问题的产生: Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突. 如下例:假设有一个卖票 ...

  6. 多线程学习-基础( 九)线程同步Synchronized关键字

    一.线程同步1.synchronized关键字的作用域有二种:(1)某个对象实例内:synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果 ...

  7. Java线程同步synchronized的理解

    JVM中(留神:马上讲到的这两个存储区只在JVM内部与物理存储区无关)存在一个主内存(Main Memory),Java中所有的变量存储在主内存中,所有实例和实例的字段都在此区域,对于所有的线程是共享 ...

  8. java多线程:线程同步synchronized(不同步的问题、队列与锁),死锁的产生和解决

    0.不同步的问题 并发的线程不安全问题: 多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全. 我们来看三个比较经典的案例来说明线程不安全的问题. 0.1 订票问题 例如前面说过的 ...

  9. 线程同步synchronized

    一Java规划共享多个线程之间数据的能力. 当线程以异步方式訪问共享数据时.有时候是不安全的或者不和逻辑的. 比方卖火车票.同一时刻一个线程在读取数据,另外一个线程在处理数据,当处理数据的线程没有等到 ...

随机推荐

  1. WPF权限控制框架——【4】抛砖引玉

    写第一篇"权限控制框架"系列博客是在2021-01-29,在这不到一个月的时间里,收集自己零碎的时间,竟然写出了一个"麻雀虽小,五脏俱全"的权限控制框架:对于一 ...

  2. # PyComCAD介绍及开发方法

    项目地址:https://github.com/JohnYang1210/PycomCAD 1.综述 ​ 提到Autocad在工业界的二次开发,VB或者Lisp可能作为常用的传统的编程语言.但是,Py ...

  3. java的基础知识

    编写一个hello,world public  class  Hello{    public static void main(String[] arge){        System.out.p ...

  4. SSRF攻击原理

    目录 什么是SSRF 原理 防护 什么是SSRF 一个对外的Web接口,改接口能让用户控制curl命令,去访问别的web服务. 简图如下 想象一下当用户请求的baidu.com/x.php?image ...

  5. springboot整合jsp,完成公交车站路线图

    转: springboot整合jsp,完成公交车站路线图 点赞再看,养成习惯 开发环境: jdk 8 intellij idea tomcat 8 mysql 5.7 maven 3.6 所用技术: ...

  6. 解决 DatePickerDialog 在 Android7.0 API24 上使用 AlertDialog.THEME_TRADITIONAL、AlertDialog.THEME_HOLO_DARK、AlertDialog.THEME_HOLO_LIGHT等样式时无法显示为 Spinner 样式的问题

    DatePickerDemoForAndroid24 解决 DatePickerDialog 在 Android7.0 API24 上使用AlertDialog.THEME_TRADITIONAL.A ...

  7. 如何在Bash脚本中引入alias

    更多精彩内容,请关注微信公众号:后端技术小屋 alias的使用 在日常开发中,为了提高运维效率,我们会用alias(命令别名)来定义命令的简称.比如在~/.bash_profile中添加: alias ...

  8. Python数据格式:%s字符串,%d整型,%f浮点型

    格式化符% name="Tom" age=int(input("age")) pt2="%s你的年龄是%d"%(name,age) prin ...

  9. rest framework Genericview

    通用视图 Django的通用视图...被开发为普通使用模式的快捷方式......他们采取某些共同的习惯和模式的发展观和抽象,从而使您可以快速地将数据写入的共同看法,而不必重复自己发现的. - Djan ...

  10. 【工具】 memtester内存压力测试工具

    作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14497838.html 目录 一.简介 二.Memtester安装 三.使用说明 四.测试示例 一.简介 mem ...