synchronized详细说明

时间:2019-12-14 17:17:23

实现Runnable接口的方式这样写:

回顾下Runnable实的多线程是共享同一对象的,所以synchronized 的共享对象就是this

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

package cn.tx.demo4;

public class SaleTicked implements Runnable {

    int tickets = 100;

    private String name;

    private Object obj = new Object();

    @Override

    public void run() {

        while (true){

            if(saleTick()){

                break;

            }

            try {

                Thread.sleep(200);

            catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

    //此时共享对就是this

    public synchronized boolean saleTick(){

        boolean isflag = false;

        if(tickets > 0){

            System.out.println(Thread.currentThread().getName() + "卖出的座位是"+(tickets--));

        }else{

            isflag = true;

        }

        return isflag;

    }

}

继承Thread的方式:

回顾实现方式为继承Thread的run方法,实现多线程时NEW了多个Thread对象,且共享数据是以类属性实现的此时代码为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

package cn.tx.demo2;

public class SaleTickedThread extends Thread {

    private String name;

    /**

     * 定义共享的数据

     */

    static int tickets = 100;

    //创建一个锁对象(用静态实现共享)

    static Object obj = new Object();

    public SaleTickedThread(String name) {

        this.name = name;

    }

    @Override

    public void run() {

        //卖票是一个持续的动作

        while (true){

            if(saleTick()){

                break;

            }

            try {

                Thread.sleep(200);

            catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

        System.out.println(name + "卖票结束");

    }

     

    //这里调整为类方法了

    public static synchronized boolean saleTick(){

        boolean isflag = false;

        if(tickets > 0){

            System.out.println(Thread.currentThread().getName() + "卖出的座位是"+(tickets--));

        }else{

            isflag = true;

        }

        return isflag;

    }

}

如果不调整为类方法就是4个锁对象,线程会现在不安全问题

图片.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值