黑马程序员技术交流社区

标题: Java-如何解决多线程当中共享资源的冲突问题 [打印本页]

作者: 逆风TO    时间: 2020-3-10 11:20
标题: Java-如何解决多线程当中共享资源的冲突问题
本帖最后由 逆风TO 于 2020-3-10 11:22 编辑

解决多线程当中共享资源冲突的问题1. 冲突问题展示:
[Java] 纯文本查看 复制代码
/*
* 共享资源冲突的问题
*/
class SingleThread implements Runnable {

        // 共享资源,100张票
        private static int ticket = 100;

        @Override
        public void run() {
                while (true) {
                        if (ticket > 0) {
                                System.out.println(Thread.currentThread().getName() +
                                 "售出了第" + ticket + "张票");
                                ticket -= 1;
                                
                                try {
                                        Thread.sleep(100);
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        } else {
                                System.out.println(Thread.currentThread().getName() +
                                 "售罄!!!");
                                break;
                        }
                }
        }
}

public class Demo1 {
        public static void main(String[] args) {
                Thread thread = new Thread(new SingleThread(),"淘票票");
                Thread thread2 = new Thread(new SingleThread(),"猫眼");
                Thread thread3 = new Thread(new SingleThread(),"美团");
               
                thread.start();
                thread2.start();
                thread3.start();
        }
}



从上面的例子上可以看到,最后一张票被每一个平台都卖了一次,这样子肯定是不符合实际情况的,这就是本次我们需要解决的问题。

2. 解决方法:2.1 同步代码块  1.格式:
[Java] 纯文本查看 复制代码
synchronized ("锁") {//需要同步的代码


2.特征:
a: synchronized关键字后面的小括号里面的对象是锁对象,并且要求如果是多线程的情况下,锁对象必须是唯一的。
b: synchronized后大括号中的代码就是需要同步的代码,或者说加锁的代码,大括号里面的内容一次有且只允许一个线程类对象进入执行的操作,其余的线程类对象需要等待该线程类对象开锁才能进入。
c: 同步代码块中的代码越短越好,在保证足够安全的情况下,提高性能。

[Java] 纯文本查看 复制代码
// 1. 使用同步代码块解决多线程中共享资源冲突的问题

/**
* 自定义售票线程类
*
* @author
*
*/
//同步代码块
class SingleThread1 implements Runnable {

        // 共享资源,100张票
        private static int ticket = 100;

        @Override
        public void run() {
                while (true) {
                        synchronized ("锁") {

                                if (ticket > 0) {
                                        System.out.println(Thread.currentThread().getName() +
                                         "售出了第" + ticket + "张票");
                                        ticket -= 1;

                                        try {
                                                Thread.sleep(100);
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                } else {
                                        System.out.println(Thread.currentThread().getName() +
                                         "售罄!!!");
                                        break;
                                }
                        }
                }
        }
}

public class Demo2 {
        public static void main(String[] args) {
                Thread thread = new Thread(new SingleThread1(), "淘票票");
                Thread thread2 = new Thread(new SingleThread1(), "猫眼");
                Thread thread3 = new Thread(new SingleThread1(), "美团");

                thread.start();
                thread2.start();
                thread3.start();
        }
}

2.2 同步方法
什么是同步方法:使用synchronized关键字修饰的方法就是同步方法,同步方法一次有且只允许一个线程类对象进入执行操作。
2.2.1 静态同步方法
静态方法使用synchronized关键字修饰就是静态同步方法,静态同步方法的锁对象是当前类对应的字节码文件,是唯一的。
如果是选择静态同步方法的话,因为锁对象是.class字节码文件,具有唯一性,多个线程使用的锁是同一个。

[Java] 纯文本查看 复制代码
// 2.1 使用静态成员方法解决多线程中共享资源冲突的问题
/**
* 自定义售票线程类
*
* @author
*
*/
//同步方法
class SingleThread3 implements Runnable {

        // 共享资源,100张票
        private static int ticket = 100;

        @Override
        public void run() {
                while (true) {
                        sellTicket();
                        if(ticket <= 0) {
                                break;
                        }
                }
        }

        // 静态同步方法
        public static synchronized void sellTicket() {
                if (ticket > 0) {
                        System.out.println(Thread.currentThread().getName() +
                         "售出了第" + ticket + "张票");
                        ticket -= 1;

                        try {
                                Thread.sleep(100);
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                } else {
                        System.out.println(Thread.currentThread().getName() + "售罄!!!");
                }
        }
}

public class Demo3 {
        public static void main(String[] args) {
        //使用静态同步方法
                Thread thread1 = new Thread(new SingleThread3(), "淘票票");
                Thread thread2 = new Thread(new SingleThread3(), "猫眼");
                Thread thread3 = new Thread(new SingleThread3(), "美团");

                thread1.start();
                thread2.start();
                thread3.start();
        }
}

2.2.2 非静态同步方法
[Java] 纯文本查看 复制代码
// 2.2 使用静态成员方法解决多线程中共享资源冲突的问题
/**
* 自定义售票线程类
*
* @author
*
*/
//同步方法
class SingleThread3 implements Runnable {

        // 共享资源,100张票
        private static int ticket = 100;

        @Override
        public void run() {
                while (true) {
                        sellTicket();
                        if(ticket <= 0) {
                                break;
                        }
                }
        }
        
        //非静态同步方法
        public synchronized void sellTicket() {
                if (ticket > 0) {
                        System.out.println(Thread.currentThread().getName() +
                         "售出了第" + ticket + "张票");
                        ticket -= 1;

                        try {
                                Thread.sleep(100);
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                } else {
                        System.out.println(Thread.currentThread().getName() +
                         "售罄!!!");
                }
        }

}

public class Demo3 {
        public static void main(String[] args) {
                //使用非静态同步方法
                //使用同一个目标代码对象
                SingleThread3 singleThread3 = new SingleThread3();
                Thread thread1 = new Thread(singleThread3,"淘票票");
                Thread thread2 = new Thread(singleThread3,"猫眼");
                Thread thread3 = new Thread(singleThread3,"美团");
        }
}

2.3 Lock锁






作者: 王锦    时间: 2020-3-24 11:38

作者: zhaosongzhi    时间: 2020-3-24 11:41
学习到很多
作者: 你不爱我    时间: 2020-3-24 11:45
加油                     
作者: zhaosongzhi    时间: 2020-3-24 11:48
学习到很多
作者: zhanghua342    时间: 2020-3-24 11:49

作者: zhaosongzhi    时间: 2020-3-24 11:56
学习到很多
作者: 小公举    时间: 2020-3-24 12:02
多线程是不是很难呀    好难呀  哈哈哈  谢谢楼主的分享
作者: 1467584    时间: 2020-3-24 12:41
6666666666666666666666666666666666666
作者: sdjadyhm    时间: 2020-3-24 15:22
6666666666666666
作者: 孙丽    时间: 2020-3-24 15:52
666666666666666666666666666666666666
作者: 逆风TO    时间: 2020-3-24 16:16
面试重点呀  感谢楼主的分享   优秀   棒棒棒
作者: duanshaobo    时间: 2020-3-24 16:34
六六六六六六六六六
作者: 半个程序员    时间: 2020-3-24 16:46

学习到很多
作者: 半个程序员    时间: 2020-3-24 16:46

学习到很多
作者: 咨询部王丹    时间: 2020-3-25 09:48
努力加油了!!!
作者: 霍尔    时间: 2020-3-25 15:50
棒棒的
作者: 王微    时间: 2020-3-25 15:53

作者: kdhdjdj    时间: 2020-3-25 16:44

棒棒的
棒棒的
棒棒的
棒棒的
作者: hongping    时间: 2020-3-25 16:59

感谢分享  加油哦~
作者: 哦嗨呦    时间: 2020-3-25 17:07
好人一生平安
作者: yujq    时间: 2020-3-25 19:22
666666666666666666666
作者: manyihang    时间: 2020-3-26 09:07
加油
作者: 李娟玲老师    时间: 2020-3-26 10:19
加油,努力,你是最棒哒!
作者: 李娟玲老师    时间: 2020-3-26 10:20
感谢分享,加油!!!
作者: 小西西哦    时间: 2020-3-26 10:22

作者: daoqin    时间: 2020-3-26 15:02
感谢分享  加油哦~
作者: lzq123    时间: 2020-3-26 16:55

作者: zplxwl    时间: 2020-3-26 19:54
很不错哦!!!!!!!
作者: 八戒猪    时间: 2020-3-26 21:00
6666666666666 加油
作者: 黑马程序员啊    时间: 2020-3-26 22:46
感谢楼主的分享  棒棒棒
作者: 大安    时间: 2020-3-27 10:17

加油,你是最棒哒!
作者: 大智叔叔    时间: 2020-3-27 10:51


感谢分享  加油哦~
作者: 举个栗子    时间: 2020-3-27 10:53

作者: 就业高冷派    时间: 2020-3-27 10:57
棒棒的
棒棒的
棒棒的
作者: 爱笑的姑娘    时间: 2020-3-27 10:59
666666666666666666666666666666
作者: 影@子~    时间: 2020-3-27 11:11

666666666666666666666
作者: hello!!!    时间: 2020-3-27 11:22

作者: 我爱我1022    时间: 2020-3-27 11:33
加油
作者: jsnoob    时间: 2020-3-27 12:37
加油,加油,加油!!!
作者: 殷凯老师    时间: 2020-3-27 14:01
66666666666666
作者: 耙丫丫    时间: 2020-3-27 16:23
6666666666666666666666666
作者: longyu3    时间: 2020-3-27 16:55

感谢分享,,,加油加油^0^~
作者: Emmmmm~    时间: 2020-3-27 17:47
棒棒哒棒棒哒
作者: lvxinvip    时间: 2020-3-27 18:14

作者: 素问    时间: 2020-3-27 20:47
感谢分享,加油~~~~!!!!!!!
作者: 零度☆黎明    时间: 2020-3-27 20:47
666666666666666666666666666666
作者: mydorling11    时间: 2020-3-27 21:39
666666666666666666666666666666666666
作者: 我是小圆圆    时间: 2020-3-27 23:15
6666666666666666666666666666
作者: 咨询部王丹    时间: 2020-4-7 10:34
努力加油!!!
作者: zhanghua342    时间: 2020-4-7 10:35

作者: 我爱我1022    时间: 2020-4-7 10:37
棒棒哒
作者: lzq123    时间: 2020-4-7 11:32
66666666666666666666666
作者: hello!!!    时间: 2020-4-7 11:49

作者: 我是小圆圆    时间: 2020-4-7 12:24
奥利给
作者: 马洁    时间: 2020-4-13 10:21
6666666666666666666666666
作者: 逆风TO    时间: 2020-4-13 15:50
王锦 发表于 2020-3-24 11:38

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:51
1467584 发表于 2020-3-24 12:41
6666666666666666666666666666666666666

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:51
hongping 发表于 2020-3-25 16:59
感谢分享  加油哦~

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:51
hongping 发表于 2020-3-25 16:59
感谢分享  加油哦~

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:52
kdhdjdj 发表于 2020-3-25 16:44
棒棒的
棒棒的
棒棒的

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:52
duanshaobo 发表于 2020-3-24 16:34
六六六六六六六六六

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:52
半个程序员 发表于 2020-3-24 16:46
学习到很多

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:52
咨询部王丹 发表于 2020-3-25 09:48
努力加油了!!!

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:52
zhaosongzhi 发表于 2020-3-24 11:48
学习到很多

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:52
霍尔 发表于 2020-3-25 15:50
棒棒的

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:52
孙丽 发表于 2020-3-24 15:52
666666666666666666666666666666666666

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:53
zhanghua342 发表于 2020-3-24 11:49

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:53
sdjadyhm 发表于 2020-3-24 15:22
6666666666666666

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:53
王微 发表于 2020-3-25 15:53

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:53
zhaosongzhi 发表于 2020-3-24 11:56
学习到很多

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:53
逆风TO 发表于 2020-4-13 15:50
努力,加油哦~

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:53
半个程序员 发表于 2020-3-24 16:46
学习到很多

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
霍尔 发表于 2020-3-25 15:50
棒棒的

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
王微 发表于 2020-3-25 15:53

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
duanshaobo 发表于 2020-3-24 16:34
六六六六六六六六六

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
zhaosongzhi 发表于 2020-3-24 11:41
学习到很多

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
duanshaobo 发表于 2020-3-24 16:34
六六六六六六六六六

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
咨询部王丹 发表于 2020-3-25 09:48
努力加油了!!!

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
kdhdjdj 发表于 2020-3-25 16:44
棒棒的
棒棒的
棒棒的

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
hongping 发表于 2020-3-25 16:59
感谢分享  加油哦~

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
哦嗨呦 发表于 2020-3-25 17:07
好人一生平安

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
jsnoob 发表于 2020-3-27 12:37
加油,加油,加油!!!

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
举个栗子 发表于 2020-3-27 10:53

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
hello!!! 发表于 2020-3-27 11:22

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:54
影@子~ 发表于 2020-3-27 11:11
666666666666666666666

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
我爱我1022 发表于 2020-3-27 11:33
加油

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
就业高冷派 发表于 2020-3-27 10:57
棒棒的
棒棒的
棒棒的

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
逆风TO 发表于 2020-4-13 15:54
努力,加油哦~

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
zplxwl 发表于 2020-3-26 19:54
很不错哦!!!!!!!

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
黑马程序员啊 发表于 2020-3-26 22:46
感谢楼主的分享  棒棒棒

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
大安 发表于 2020-3-27 10:17
加油,你是最棒哒!

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
黑马程序员啊 发表于 2020-3-26 22:46
感谢楼主的分享  棒棒棒

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
hello!!! 发表于 2020-3-27 11:22

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
逆风TO 发表于 2020-4-13 15:54
努力,加油哦~

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
逆风TO 发表于 2020-4-13 15:54
努力,加油哦~

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
影@子~ 发表于 2020-3-27 11:11
666666666666666666666

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
hello!!! 发表于 2020-3-27 11:22

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
zplxwl 发表于 2020-3-26 19:54
很不错哦!!!!!!!

努力,加油哦~
作者: 逆风TO    时间: 2020-4-13 15:55
八戒猪 发表于 2020-3-26 21:00
6666666666666 加油

努力,加油哦~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2