java多线程——同步的前提

来源:互联网 发布:软件售后服务条款 编辑:程序博客网 时间:2024/06/08 02:32

同步的前提

  • 必须要有两个或以上的线程
  • 必须是所有的线程使用同一个锁
    这样保证同步中只能有一个线程在运行

在多线程安全问题设置同步时候注意

  • 明确哪些代码是多线程运行代码
  • 明确哪些是共享数据
  • 明确多线程运行代码中,哪些语句是操作共享数据的

同步的优点

解决了多线程的安全问题

同步的缺点

多个线程判断锁,较为耗费资源

class ThreadDemo1 {    public static void main(String[] args) {        Ticket tic = new Ticket();        Thread t1 = new Thread(tic);        Thread t2 = new Thread(tic);        Thread t3 = new Thread(tic);        t1.start();        t2.start();        t3.start();    }}class Ticket implements Runnable {    private int ticket = 500;    Object obj = new Object();    public void run() {        while (true) {        synchronized (obj) {            if (this.ticket > 0) {                try {                    Thread.sleep(10);                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                System.out.println(Thread.currentThread().getName() + " ... " + this.ticket);                this.ticket--;            }        }        }    }}
class ThreadDemo2 {    public static void main(String[] args) {        Customer cus = new Customer();        Thread t1 = new Thread(cus);        Thread t2 = new Thread(cus);        t1.start();        t2.start();    }}/** * 一个银行,有两个客户向银行存钱,每个客户有300元,每次均是存100元,每个人存3次 * */class Bank{    private int sumMoney;    public synchronized void add(int money){        this.sumMoney  = this.sumMoney + money;        try {            Thread.sleep(10);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("sumMoney = " + this.sumMoney);    }}class Customer implements Runnable{    private Bank bank = new Bank();    public  void run(){        for (int i = 1; i<=3; i++){            bank.add(100);        }    }}
0 0