美文网首页
线程:并发问题

线程:并发问题

作者: 寂静的春天1988 | 来源:发表于2019-01-16 10:55 被阅读0次

多个线程访问同一份资源,就会产生线程安全问题。
1)可以使用synchronized修饰方法,那么它会阻塞线程,一个线程访问,那么其他线程必须等待!
2)可以使用同步代码块
synchronized (this){

}
同步代码块的形参必须是引用类型,同步代码块容易犯的错:
2.1锁定范围不正确,范围过大,效率低下。范围过小,没有起到线程安全的效果。
2.2锁定资源不正确。

单例模式(恶汉式)

public static void main(String[] args) {
        DemoThread d1=new DemoThread();
        DemoThread d2=new DemoThread();
        d1.start();
        d2.start();
    }
}

class Demo{
    private static Demo demo=null;
    private Demo(){
        
    }
    public static Demo getDemo(){
        if(demo==null){
            try {
                Thread.sleep(10000);//模拟网络延时等
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            demo=new Demo();
        }
        return demo;
    }
}
class DemoThread extends Thread{
    @Override
    public void run() {
        Demo demo = Demo.getDemo();
        System.out.println(demo);
    }
    
}

可以发现由于网络延时等原因,发现上面那段代码在多线程下也有可能创建两个对象
1、可以使用同步方法解决,直接加上synchronized修饰getDemo方法
2、使用同步代码块

public static  Demo getDemo(){
        synchronized(Demo.class){
            if(demo==null){
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                demo=new Demo();
            }
        }
        
        return demo;
    }

上面可以解决,但是发现效率不高,如果对象不为null,那么也要进入同步代码块。可以优化成以下代码

public static  Demo getDemo(){
        if(demo==null){
            synchronized(Demo.class){
                if(demo==null){
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    demo=new Demo();
                }
            }
        }
        return demo;
    }

仔细分析代码可以发现,只需要对象为null时进入同步代码块,所以加了一个if(demo==null)的判断

相关文章

  • 后端架构师技术图谱(三)-并发、锁、设计模式(二)

    并发 多线程 《40个Java多线程问题总结》 线程安全 《Java并发编程——线程安全及解决机制简介》 一致性、...

  • Java并发问题

    并发问题 Java并发问题就是多个线程共享资源引起的问题;举个例子,两个线程同时修改一个对象的值,就会出现并发问题...

  • java刷题-2

    总结 多线程控制并发顺序问题,线程之间通信问题AtomicIntegerlock wait + notifyAll...

  • Java内存模型

    并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发...

  • Java 内存模型

    并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发...

  • iOS 多线程问题

    目录多线程简介iOS多线程NSThread解决线程阻塞问题多个线程并发线程状态扩展--NSObject分类扩展方法...

  • iOS多线程-并发队列

    GCD 并发队列 并发队列,异步执行 问题:1.会开几条线程?会开多条线程,线程数量是由GCD来决定2.会顺序执行...

  • 06 GCD 并发队列

    03 GCD-并发队列 并发队列,异步执行 问题:1.会开几条线程?会开多条线程,线程数量是由GCD来决定2.会顺...

  • Java并发 - 并发编程实战

    Java并发 - 线程Java并发 - 线程池Java并发 - Executor/ExecutorService/...

  • JMM内存模型简介

    1.并发编程模型的两个关键问题 并发编程中需要处理两个关键问题:线程之间如何通信和线程之间如何同步。通信是指线程之...

网友评论

      本文标题:线程:并发问题

      本文链接:https://www.haomeiwen.com/subject/qfipdqtx.html