首页 > 软件开发 > JAVA >

线程间同步的方法

来源:互联网 2023-03-16 19:15:42 200

想了解线程同步的方法就得先知道什么是线程,然后线程怎么创建的,再然后就是去实现线程的同步。v6R办公区 - 实用经验教程分享!

什么是线程?v6R办公区 - 实用经验教程分享!

线程是电脑程序运行时的最小单元,一个电脑程序运行会有一个或多个线程存在。v6R办公区 - 实用经验教程分享!

下面我会以java代码来讲解线程间的同步方法。v6R办公区 - 实用经验教程分享!

工具/原料

  • 电脑
  • 编程工具(myeclipse/eclipse/netbeans/其他java编程IDE)

方法/步骤

  • 1

    首先我们得带着问题去学习,线程为何会有同步一说?v6R办公区 - 实用经验教程分享!

    在java中是允许多线程并发控制,当有多个线程同时操作同一个资源时,很有可能导致数据不准确,相互之间产生冲突。v6R办公区 - 实用经验教程分享!

    打个比方:我们买火车票时某个车次的火车票只剩一张,而正好A和B同时进行购买该车票,在不同步的情况下A和B可能会都收到购买成功的结果,他们购买到的是同一张票,这显然不合理。而在同步的情况下是不可能出现该种情况的。v6R办公区 - 实用经验教程分享!

    所以加入同步锁是为了避免在该线程没完成操作之前不被其他线程调用,从而达到资源的唯一性和准确性。v6R办公区 - 实用经验教程分享!

    我这用的是NetBeans估计非主流了,现在大多用的是myeclipse/eclipse。v6R办公区 - 实用经验教程分享!

    如图:v6R办公区 - 实用经验教程分享!

    线程间同步的方法v6R办公区 - 实用经验教程分享!

    线程间同步的方法v6R办公区 - 实用经验教程分享!

  • 2

    新建一个项目,我这就叫Thread_demo了。名字看自己心情命名就好。v6R办公区 - 实用经验教程分享!

    线程间同步的方法v6R办公区 - 实用经验教程分享!

  • 2本页面未经授权抓取自百度经验
  • 3

    同步方法:v6R办公区 - 实用经验教程分享!

    synchronized关键字修饰的方法即为方法的同步v6R办公区 - 实用经验教程分享!

    代码:v6R办公区 - 实用经验教程分享!

    publicsynchronized void 方法名() {v6R办公区 - 实用经验教程分享!

    需要同步的内容...v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    如图:v6R办公区 - 实用经验教程分享!

    线程间同步的方法v6R办公区 - 实用经验教程分享!

  • 4

    同步代码块:v6R办公区 - 实用经验教程分享!

    synchronized关键字修饰的语句块即为方法块的同步v6R办公区 - 实用经验教程分享!

    代码:v6R办公区 - 实用经验教程分享!

    synchronized(object){v6R办公区 - 实用经验教程分享!

    需要同步的内容...v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    如图:v6R办公区 - 实用经验教程分享!

    线程间同步的方法v6R办公区 - 实用经验教程分享!

  • 5

    线程的同步对电脑的开销是很大的,我们应该尽量避免同步的使用,或者说能缩小同步的范围就尽量减少,能同步代码块的就不要去同步整个方法。v6R办公区 - 实用经验教程分享!

    下面附上线程同步的运用:v6R办公区 - 实用经验教程分享!

    package thread_demo;v6R办公区 - 实用经验教程分享!

    /**v6R办公区 - 实用经验教程分享!

    *v6R办公区 - 实用经验教程分享!

    * @author Adminv6R办公区 - 实用经验教程分享!

    */v6R办公区 - 实用经验教程分享!

    public class Thread_Demo {v6R办公区 - 实用经验教程分享!

    class Bank {v6R办公区 - 实用经验教程分享!

    private int account = 100;v6R办公区 - 实用经验教程分享!

    public int getAccount() {v6R办公区 - 实用经验教程分享!

    return account;v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    /**v6R办公区 - 实用经验教程分享!

    * 同步方法实现v6R办公区 - 实用经验教程分享!

    * @param moneyv6R办公区 - 实用经验教程分享!

    */v6R办公区 - 实用经验教程分享!

    public synchronized void add(int money) {v6R办公区 - 实用经验教程分享!

    account = money;v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    /**v6R办公区 - 实用经验教程分享!

    * 同步代码块实现v6R办公区 - 实用经验教程分享!

    * @param moneyv6R办公区 - 实用经验教程分享!

    */v6R办公区 - 实用经验教程分享!

    public void add1(int money) {v6R办公区 - 实用经验教程分享!

    synchronized (this) {v6R办公区 - 实用经验教程分享!

    account = money;v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    v6R办公区 - 实用经验教程分享!

    class CreateThread implements Runnable {v6R办公区 - 实用经验教程分享!

    private Bank bank;v6R办公区 - 实用经验教程分享!

    public CreateThread(Bank bank) {v6R办公区 - 实用经验教程分享!

    this.bank = bank;v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    @Overridev6R办公区 - 实用经验教程分享!

    public void run() {v6R办公区 - 实用经验教程分享!

    for (int i = 0; i 10; i ) {v6R办公区 - 实用经验教程分享!

    bank.add(10);v6R办公区 - 实用经验教程分享!

    System.out.println(i "账户余额:" bank.getAccount());v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    /**v6R办公区 - 实用经验教程分享!

    * 建立线程,调用内部类v6R办公区 - 实用经验教程分享!

    */v6R办公区 - 实用经验教程分享!

    public void exeThread() {v6R办公区 - 实用经验教程分享!

    Bank bank = new Bank();v6R办公区 - 实用经验教程分享!

    CreateThread new_thread = new CreateThread(bank);v6R办公区 - 实用经验教程分享!

    System.out.println("线程1");v6R办公区 - 实用经验教程分享!

    Thread thread1 = new Thread(new_thread);v6R办公区 - 实用经验教程分享!

    thread1.start();v6R办公区 - 实用经验教程分享!

    System.out.println("线程2");v6R办公区 - 实用经验教程分享!

    Thread thread2 = new Thread(new_thread);v6R办公区 - 实用经验教程分享!

    thread2.start();v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    v6R办公区 - 实用经验教程分享!

    public static void main(String[] args) {v6R办公区 - 实用经验教程分享!

    Thread_Demo td = new Thread_Demo();v6R办公区 - 实用经验教程分享!

    td.exeThread();v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    }v6R办公区 - 实用经验教程分享!

    如图:v6R办公区 - 实用经验教程分享!

    1:为加synchronized关键词的结果,即同步得到的结果v6R办公区 - 实用经验教程分享!

    2:为不加synchronized关键词的结果,即不同步得到的结果v6R办公区 - 实用经验教程分享!

    线程间同步的方法v6R办公区 - 实用经验教程分享!

    线程间同步的方法v6R办公区 - 实用经验教程分享!

  • 注意事项

    • 这只是大java实现线程同步的其中一种形式哦~
    • 各位看官如有帮到你的还请动动你的小手指点个赞投个票哟!

    以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!v6R办公区 - 实用经验教程分享!


    标签: 硬件JAVA

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码