栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java学习:两种方法解决线程安全问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java学习:两种方法解决线程安全问题

截止JDK5.0为止,实现多线程一共有两种方法

①用继承extends Thread类的方式实现多线程

②用实现implement Runnable接口的方式实现多线程

一.同步代码块方式 1.1 同步代码块解决①的线程安全问题
public class ThreadSafeEx2 {
    public static void main(String[] args) {
        SoldOuts s1 = new SoldOuts();
        SoldOuts s2 = new SoldOuts();
        SoldOuts s3 = new SoldOuts();

        s1.setName("售票口1:");
        s2.setName("售票口2:");
        s3.setName("售票口3:");

        s1.start();
        s2.start();
        s3.start();
    }
}

class SoldOuts extends Thread{
    private static int tickets = 100;

    @Override
    public void run() {
        while (true){
            synchronized (SoldOuts.class) {//最方便的写法SoldOuts.class
                if (tickets > 0) {
                    System.out.println(getName()+"票号为:" + (100 - (tickets - 1)));
                    tickets--;
                } else {
                    break;
                }
            }
        }
    }
}
1.2 同步代码块解决②的线程安全问题
public class ThreadSafeEx1 {
    public static void main(String[] args) {
        sold s = new sold();
        Thread t1 = new Thread(s);
        Thread t2 = new Thread(s);
        Thread t3 = new Thread(s);

        t1.setName("售票口1:");
        t2.setName("售票口2:");
        t3.setName("售票口3:");

        t1.start();
        t2.start();
        t3.start();
    }
}

class sold implements Runnable{
    private int tickets = 100;
    @Override
    public void run() {
        while (true){
            //synchronized(this)最方便
            synchronized(this) {//括号里加入同步监视器
                                //任何对象都可以充当同步监视器(锁)
                                //要求子类的多个线程必须用同一把锁
                if (tickets > 0) {

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println(Thread.currentThread().getName()+
                            "票号为" + (101 - tickets));
                    tickets--;
                } else {
                    break;
                }
            }
        }

    }
}

二.同步方法方式 2.1 同步方法解决①的线程安全问题
public class ThreadSafeEx4 {
    public static void main(String[] args) {
        so1 s1 = new so1();
        so1 s2 = new so1();
        so1 s3 = new so1();

        s1.setName("线程1:");
        s2.setName("线程2:");
        s3.setName("线程3:");

        s1.start();
        s2.start();
        s3.start();
    }
}
class so1 extends Thread{
    private static int tickets =100;

    @Override
    public void run() {
        while (tickets > 0){
            SoldOut();
        }
    }


    private static synchronized void SoldOut(){//锁默认为当前类.class
        if (tickets > 0) {
            System.out.println(Thread.currentThread().getName() + "票号为:" + (100 - (tickets - 1)));
            tickets--;
        }
    }
}
2.2 同步方法解决②的线程安全问题
public class ThreadSafeEx3 {
    public static void main(String[] args) {
        so s = new so();

        Thread s1 = new Thread(s);
        Thread s2 = new Thread(s);
        Thread s3 = new Thread(s);


        s1.setName("售票口1:");
        s2.setName("售票口2:");
        s3.setName("售票口3:");

        s1.start();
        s2.start();
        s3.start();
    }
}

class so implements Runnable{
    private static int tickets = 100;

    @Override
    public void run() {
            while (tickets > 0){
                SoldOut();
            }
    }

    private synchronized void SoldOut() {//同步监视器:this
        if (tickets > 0) {
            System.out.println(Thread.currentThread().getName() + "票号为:" + (100 - (tickets - 1)));
            tickets--;
        }

    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749601.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号