线程同步、线程安全的单例模式

1.线程同步就是指多个线程同时轮流抢占CPU资源,但可能会造成数据的错误

1)当某一个CPU资源为共享时,将其定义为static类型,类变量,全类都可以访问,为共享资源准备

2)当线程一起争夺CPU资源时,CPU资源被声明为static类时,线程里面的内容会因为线程的休眠被最后一个线程覆盖

3)线程同步可以解决这个问题,通过synchronized关键字修饰共享资源方法,相当于给在运行的线程上一把内置锁

只有当它运行完后,才会允许其他线程争夺之后循环这个操作

4 )线程同步还可以锁定代码块,就是线程们共享的资源,这个时候需要通过synchronized关键字锁住他们共处的类,并加上.class来标识

2.如何判断线程是同步还是不同步?

看他们锁定的资源时一份还是多份,一份就是同步,多份就是不同步

3.本质上,无论是锁定类还是方法,主要看他是不是独一无二的,也就是说看他是不是一份,例如类是一个,方法很多

方法是静态那么就独此一份,非静态就是多份

4.单例模式就是一个类只有一个对象

主要分三种情况

1)第一种:单线程的单例模式

创建一个类用于线程对共享资源的抢占,该类将对象声明私有,创建一个公共方法来创建对象

再创建一个测试类来创建实例对象

复制代码
public class SingleThread1{
    private static SingleThread singleThread;
    public SingleThread(){
    System.out.println("创建了SingleThread对象!");}
    public static synchronized SingleThread getsingleThread(){
    if(singleThread==null){
    singleThread = new SingleThread();
    }
    return singlrThread;}
}
public class Test{
    public static void main(String []args){
    SingleThread singleThread = SingleThread.getsingleThread();
    }
}
复制代码

 

2)第二种:多线程的单例模式

测试类里面通过匿名类创建两个线程用于对共享资源类的竞争来体现单例

复制代码
public class SingleThread1{
    private static SingleThread singleThread;
    public SingleThread(){
    System.out.println("创建了SingleThread对象!");}
    public static synchronized SingleThread getsingleThread(){
    if(singleThread==null){
    singleThread = new SingleThread();
    }
    return singlrThread;}
}
public class test1{
    public static void main(String []args){
    new Thread(new Runnable(){
    @Override
    public void run(){
    SingleThread singleThread1  = SingleThread.getsingleThread();}
    }).start();
    new Thread(new Runnable(){
    @Override
    public void run(){
    SingleThread singleThread2  = SingleThread.getsingleThread();}
    }).start();
    }
}
复制代码

第三种锁定共享代码块,双层检测

无需将公共使用的整个方法都锁住,只需要锁住他们共享资源代码块也是一样的效果,而且这样更有效

复制代码
public class SingleThread{
    private static SingleThread singleThread;
    public SingleThread(){
    System.out.println("创建了SingleThread对象");
    public static  SingleThread getsingleThread(){
    if(singleThread == null){
    synchronized(SingleThread.class){
    if(singleThread == null){
    singleThread = new SingleThread();}
    }
    }
    return singleThread;}}
}
public class test1{
    public static void main(String []args){
    new Thread(new Runnable(){
    @Override
    public void run(){
    SingleThread singleThread1  = SingleThread.getsingleThread();}
    }).start();
    new Thread(new Runnable(){
    @Override
    public void run(){
    SingleThread singleThread2  = SingleThread.getsingleThread();}
    }).start();
    }
}
复制代码

总结:可能几天没有看java,有些东西有些忘咯,今天所学的知识还是有些没有捋清楚

线程同步。其实就是先判断共享资源是不是只此一份,如果是的话就是线程同步,如果不是的话就是不同步

如果是线程同步的话,会造成数据的错误,这个时候我们通过关键字synchronized来修饰这些“唯一”的共享资源

是他们顺序无误的完成任务,那他们如何唯一呢,第一个判断是否是static类型的,他是否是类,如果是的,那么就是唯一的

就是共享的

线程的单机模式

分三种情况:

第一种是单线程的单机模式,一个类一个对象独享共享资源

第二种多线程的单机模式,此时可以通过synchronized关键字来修饰他们所共享的资源,使他们各自单独完成任务

第三种多线程的单机模式详细,通过双层检测再结合synchronized关键字修饰代码块来完成数据的准确

posted @   求知律己  阅读(96)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示