栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【多线程学习02】线程同步

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【多线程学习02】线程同步

 线程同步问题:共享内存区域被多个线程访问,至少有一个线程是写操作

协调多个线程的并发执行的过程称为同步(Synchronization)         协调多个线程对共享内存区域的访问         确保按照某种正确顺序访问共享内存区域 基本方法:使用 synchronized关键字 线程互斥:synchronized 修饰类的方法 或者代码块 ,保证同一时刻最多只有一个线程能够执行这个类的对象被 synchronized 修饰的方法 或者 代码块。 三个线程同时买票问题:
package thread;

import static java.lang.Thread.sleep;

public class BuyTicket {
    public static void main(String[] args) {
        //创建一个Runnable接口对象
        Ticket ticket = new Ticket();

        //new三个线程操作同一个对象ticket
        new Thread(ticket, "Yoimiya").start();
        new Thread(ticket, "Fischl").start();
        new Thread(ticket, "Xiao").start();

    }
}

class Ticket implements Runnable {

    int tickets = 10;  //票数
    boolean flag = true;   //外部停止方式

    @Override
    public void run() {
        //买票
        while(flag){
            try {
                sleep(200);   //模拟延时(,放大问题)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            buyTicket();
        }
    }

    //synchronized 同步方法, 锁的是this
    public synchronized void buyTicket(){
        if(tickets <= 0){
            flag = false;  //外部停止
        }else{  //获取当前Thread对象名
            System.out.println(Thread.currentThread().getName() + "买了第" + tickets-- + "张票");
        }

    }
}

银行账户存取款问题:(存钱方法和取钱方法都写在Account类里,使用synchronized实现互斥)

package thread;

import static java.lang.Thread.MAX_PRIORITY;
import static java.lang.Thread.sleep;

public class BankAccount {

    public static void main(String[] args) {
        Account account = new Account(1000,"Yoimiya");//创建银行账户对象

        SaveMoney saveMoney = new SaveMoney(account, 100);//创建存钱线程

        DrawMoney drawMoney = new DrawMoney(account,800);//创建取钱线程
        DrawMoney drawMoney01 = new DrawMoney(account,500);

        Thread thread = new Thread(saveMoney, "Yoimiya");
        thread.setPriority(MAX_PRIORITY);  //线程设置优先级(1-10)(MAX_PRIORITY == 10)
        thread.start();  //开启线程

        new Thread(drawMoney, "Yoimiya").start();
        new Thread(drawMoney01, "Xiao").start();
    }
}

class Account{
    private double money;  //账户余额
    private String name;   //账户名(此段代码无用)

    public Account(double money, String name) {//有参构造(传递参数)
        this.money = money;
        this.name = name;
    }

    
    //存钱方法,使用synchronized同步
    public synchronized double saveMoney(double saveMoney){
        money = money + saveMoney;
        System.out.println(Thread.currentThread().getName() + "存了" + saveMoney + ",现在余额为" + money);
        return money;
    }
    //取钱方法,使用synchronized同步
    public synchronized double drawMoney(double drawMoney){
        if(money >= drawMoney){
            money = money - drawMoney;
            System.out.println(Thread.currentThread().getName() + "取了" + drawMoney + "余额为" + money);
        }
        else{
            System.out.println(Thread.currentThread().getName() + "要取" + drawMoney + "余额为" + money + "不足");
        }
        return money;
    }
}

//创建存钱线程
class SaveMoney implements Runnable{

    private Account account;
    private double saveMoney;

    public SaveMoney(Account account, double saveMoney) {
        this.account = account;
        this.saveMoney = saveMoney;
    }

    @Override
    public void run() {
        try {
            sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        account.saveMoney(saveMoney);
    }

}

//创建取钱线程
class DrawMoney implements Runnable{

    private Account account;
    private double drawMoney;

    public DrawMoney(Account account, double drawMoney) {
        this.account = account;
        this.drawMoney = drawMoney;
    }

    @Override
    public void run() {
        try {
            sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        account.drawMoney(drawMoney);
    }

}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/727684.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号