• java中线程的同步


    线程同步:

    当有两个进程并发修改同一文件时就可能造成异常。

    意思就是当一个线程要改变一个文件的内容时,却sleep了一段时间,这时另一个线程却改变了这个文件的内容。最后就会出现错误的结果。

    为了解决这个问题,java多线程支持引入了同步监视器来解决这个问题。使用同步监视器的通用方法就是同步代码块。

    同步代码块的语法格式如下:

    synchronizedobj){

    ······

    //此处的代码就是同步代码块

    上面语法格式中synchronized后括号里的obj就是同步监视器,上面代码的含义是:线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。

    注意:

    任何时刻智能有一个线程可以获得对同步监视器的锁定,当同步代码块执行完成后,该线程会释放对该同步监视器的锁定。

    同步监视器:共享资源的对象。

     1 public class SynchronizedClass extends Thread{
     2     private Account account;
     3     private double drawbalance;
     4     public SynchronizedClass(String name,Account account,double drawbalance){
     5         super(name);
     6         this.account=account;
     7         this.drawbalance=drawbalance;
     8         start();
     9     }
    10     public void run(){
    11         synchronized(account){
    12             if(drawbalance>account.getBalance()){
    13                 System.out.println("余额不足!");
    14             }else{
    15                 System.out.println("吐钱成功!");
    16                 try{
    17                     sleep(100);
    18                     account.setBalance(account.getBalance()-drawbalance);
    19                     System.out.println("余额为:"+account.getBalance());
    20                 }catch(Exception e){
    21                     System.out.println(e);
    22                 }
    23             }
    24         }
    25     }
    26     public static void main(String[] args){
    27         Account a=new Account("刘腾",100000);
    28         new SynchronizedClass("A线程",a,100000);
    29         new SynchronizedClass("B线程",a,10000);
    30     }
    31 }
    32 //账户
    33 class Account {
    34     private String name;
    35     private double balance;
    36     public Account(){}
    37     public Account(String name,double balance){
    38         this.name=name;
    39         this.balance=balance;
    40     }
    41     public void setName(String name){
    42         this.name=name;
    43     }
    44     public void setBalance(double balance){
    45         this.balance=balance;
    46     }
    47     public String getName(){
    48         return name;
    49     }
    50     public double getBalance(){
    51         return balance;
    52     }
    53     public boolean equals(Object obj){
    54         if(this==obj)return true;
    55         if(obj!=null)return false;
    56         if(getClass()!=obj.getClass())return false;
    57         Account other =(Account) obj;
    58         if(other.name==name&&other.balance==balance)return true;
    59         else return false;
    60     }
    61 }
  • 相关阅读:
    一个程序员的负罪感
    【软件安装记录篇】本地虚拟机Centos7快速安装MySQL
    三分钟熟悉进制转换与位运算
    Base64 编码原理
    Java 注解
    数据结构之链表-动图演示
    数据结构之红黑树-动图演示(下)
    数据结构之红黑树-动图演示(上)
    通过TreeMap 和 冒泡算法对JSON 进行排序
    Quartz 之 windowService
  • 原文地址:https://www.cnblogs.com/teng-IT/p/4445183.html
Copyright © 2020-2023  润新知