Java开发入门到精通--Java中解决多线程数据安全问题
小职 2021-08-31 来源 :原文链接:https://www.cnblogs.com/testero/p/15135598.ht 阅读 1093 评论 0

摘要:本文主要介绍了Java开发入门到精通--Java中解决多线程数据安全问题,通过具体的内容向大家展现,希望对大家Java开发的学习有所帮助。

本文主要介绍了Java开发入门到精通--Java中解决多线程数据安全问题,通过具体的内容向大家展现,希望对大家Java开发的学习有所帮助。

Java开发入门到精通--Java中解决多线程数据安全问题

同步代码块

基本语句

synchronized (任意对象) {

操作共享代码

}


代码示例


public class SellTicket implements Runnable {

    private int tickets = 100;

    private Object object = new Object();



    @Override

    public void run() {

        while (true) {

            synchronized (object) {

                if (tickets > 0) {

                    try {

                        Thread.sleep(100);

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                    System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");

                    tickets--;

                }

            }

        }

    }



    public static void main(String[] args) {


        SellTicket sellTicket = new SellTicket();


        Thread thread1 = new Thread(sellTicket, "窗口1");

        Thread thread2 = new Thread(sellTicket, "窗口2");

        Thread thread3 = new Thread(sellTicket, "窗口3");

        thread1.start();

        thread2.start();

        thread3.start();

    }

}


优缺点:

解决了多线程的数据安全问题

多线程时,每个线程都会判断同步上的锁,耗费资源,降低了程序的运行效率

同步方法

同步方法:将synchronized关键字加到方法上

格式: 修饰符 synchronized 返回值类型 方法名(){ }

同步方法的锁对象是this

同步静态方法,就是把synchronized关键字加到静态方法上

格式: 修饰符 static synchronized 返回值类型 方法名(){ }

同步静态方法的锁对象是 类名.class

代码示例


public class SellTicket implements Runnable {

//    private int tickets = 100;

    private static int tickets = 100;

    private Object object = new Object();

    private int x = 0;



    @Override

    public void run() {

        while (true) {

            if (x % 2 == 0) {

//                synchronized (object) {

//                synchronized (this) {

                synchronized (SellTicket.class) {

                    if (tickets > 0) {

                        try {

                            Thread.sleep(100);

                        } catch (InterruptedException e) {

                            e.printStackTrace();

                        }

                        System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");

                        tickets--;

                    }

                }

            } else {

//                synchronized (object) {

//                    if (tickets > 0) {

//                        try {

//                            Thread.sleep(100);

//                        } catch (InterruptedException e) {

//                            e.printStackTrace();

//                        }

//                        System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");

//                        tickets--;

//                    }

//                }

                sellTicket();

            }

            x++;

        }

    }


//    private void sellTicket(){

//        synchronized (object) {

//            if (tickets > 0) {

//                try {

//                    Thread.sleep(100);

//                } catch (InterruptedException e) {

//                    e.printStackTrace();

//                }

//                System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");

//                tickets--;

//            }

//        }

//    }


//    private synchronized void sellTicket(){

//            if (tickets > 0) {

//                try {

//                    Thread.sleep(100);

//                } catch (InterruptedException e) {

//                    e.printStackTrace();

//                }

//                System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");

//                tickets--;

//            }

    private static synchronized void sellTicket(){

        if (tickets > 0) {

            try {

                Thread.sleep(100);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");

            tickets--;

        }


    }




    public static void main(String[] args) {


        SellTicket sellTicket = new SellTicket();


        Thread thread1 = new Thread(sellTicket, "窗口1");

        Thread thread2 = new Thread(sellTicket, "窗口2");

        Thread thread3 = new Thread(sellTicket, "窗口3");

        thread1.start();

        thread2.start();

        thread3.start();

    }

}


lock锁

lock实现提供比使用synchronized方法和语句可获得更广泛的操作

void lock()获得锁

void unlock()释放

lock是接口不能直接实例化,采用实现类实例化ReentrantLock

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;




public class SellTicket implements Runnable {

    private int tickets = 100;

    private Object object = new Object();

    private Lock lock = new ReentrantLock();



    @Override

    public void run() {

        while (true) {

            try {

                lock.lock();

                if (tickets > 0) {

                    try {

                        Thread.sleep(100);

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                    System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");

                    tickets--;

                }

            } finally {

                lock.unlock();


            }

        }


    }


    public static void main(String[] args) {


        SellTicket sellTicket = new SellTicket();


        Thread thread1 = new Thread(sellTicket, "窗口1");

        Thread thread2 = new Thread(sellTicket, "窗口2");

        Thread thread3 = new Thread(sellTicket, "窗口3");

        thread1.start();

        thread2.start();

        thread3.start();

    }

}


我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取基础课程·答疑解惑·职业测评

Java开发入门到精通--Java中解决多线程数据安全问题


本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程