夜光带你走进 Java 成神之路(四十一)擅长的领域

夜光序言:

 

 

我都舍不得欺负的人,哪能让别人欺负?

 

 

 

 

 

 

 

 

 

 

正文:

                           以道御术 / 以术识道

 

 

 

 

package 深入理解volatile原理与使用;

//保证可见性的前提
//多个线程拿到的是同一把锁,否则是保证不了的
public class Demo {

    //volatile保证线程的一致性
    public volatile int a = 1; //变量上面加上一个volatile

    public synchronized int getA() {  //这里加上一把锁
        return a;
    }

    public synchronized void setA(int a) {  //这里加上一把锁
        try {
            Thread.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.a = a;
    }

    //一个线程在get,另外一个线程在set,很大情况下会出现线程安全问题
    public static void main(String[] args) {

        //我们先new一个对象出来
        Demo d = new Demo();

        d.a = 10;

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(d.a);
            }
        }).start();

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("最终的结果为:" + d.getA());

    }

}

 

package 深入理解volatile原理与使用;

public class Demo2 {

    //volatile关键词保证一下
    public volatile boolean run = false;

    public static void main(String[] args) {
        Demo2 demo2 = new Demo2();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i=1;i<=10;i++){
                    System.err.println("执行了第" + i + "次");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                demo2.run = true;
            }
        }).start();

        //第二个线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(!demo2.run){
                    //不执行
                }
                System.err.println("线程2执行了~~");
            }
        })
        .start();

    }

}

 

package Lock接口认识和使用;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//夜光
public class Sequence {

    private int value;
    Lock lock = new ReentrantLock(); //使用这个就可以了

    
    public int getNext(){  //相当于一个门,加一把锁

        lock.lock();
        int a = value++;
        lock.unlock(); //释放锁

        return value++;
    }


    public static void main(String[] args) {
        //我们调用的时候
//        new Sequence().getNext();

        //1. 下面这种方式面对多线程,会出现不可预期的问题
//        Sequence s = new Sequence();
//        while(true){ //多次调用
//            System.out.println(s.getNext());
//        }

        //2. 我们看看下面这种方式
        Sequence s = new Sequence();
        new Thread(new Runnable() {
            @Override
            public void run() {
                //下面,我们不停地去调用生成器
                while (true){
                    System.out.println(Thread.currentThread().getName()
                    +""+s.getNext());
                    try {
                        Thread.sleep(1000);  //休息一会儿
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        //然后,我们重写多个
        //嗯唔
        //第二个线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                //下面,我们不停地去调用生成器
                while (true){
                    System.out.println(Thread.currentThread().getName()
                            +""+s.getNext());
                    try {
                        Thread.sleep(1000);  //休息一会儿
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();


        //第三个线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                //下面,我们不停地去调用生成器
                while (true){
                    System.out.println(Thread.currentThread().getName()
                            +""+s.getNext());
                    try {
                        Thread.sleep(1000);  //休息一会儿
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();



    }

}

 

package 自旋锁死锁重入锁.可重入锁;


import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

public class MyLock implements Lock {

    //怎么判断第一个哈
    private boolean isLocked = false;


    @Override
    public synchronized void lock() {  //我们加上这个关键词,进来的线程要等待
        while (isLocked)  //只要为true,就~
            //.....
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        isLocked = true;
    }

    //第一个资源执行完毕,需要释放锁
    //那么我们则

    @Override
    public synchronized void unlock() {  //synchronized必须要加上这个
        isLocked = false;
        notify();
    }

    @Override
    public void lockInterruptibly() throws InterruptedException {

    }

    @Override
    public boolean tryLock() {
        return false;
    }

    @Override
    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
        return false;
    }


    @Override
    public Condition newCondition() {
        return null;
    }
}
package 自旋锁死锁重入锁.可重入锁;

//Sequence,我们写一个这个
public class Sequence {

    private MyLock lock = new MyLock(); //我们先构建一下~

    private int value;

    public int getNext(){
        lock.lock();
        value++;
        lock.unlock();

        return value;
    }

    public static void main(String[] args) {

        Sequence s = new Sequence();

        //现在,我们进行一下测试,夜光:三个线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(s.getNext());
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(s.getNext());
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(s.getNext());
            }
        }).start();


    }

}

 

 

 

上面表示不可重入

 

那么下面,我们改成可重入的

可重入的锁,需要记住当下的线程

 

package 自旋锁死锁重入锁.可重入锁;

//我们说这个锁是可以重入的,我们来写一个例子
public class Demo {

    MyLock lock = new MyLock();

    public void a(){
        lock.lock();
        System.out.println("a");
        //这里,我们调用b方法
        b();
        lock.unlock();
    }

    public void b(){
        lock.lock();
        System.out.println("b");
        lock.unlock();
    }

    //然后,我们来测试
    public static void main(String[] args) {
        Demo d = new Demo();
        //然后,我们来创建线程
        //嗯唔

        //我们只要调用a就可以了,因为a里面包含了b
        new Thread(new Runnable() {
            @Override
            public void run() {
                d.a();
            }
        }).start();

//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                d.b();
//            }
//        }).start();

    }

}

 

 

package 自旋锁死锁重入锁.可重入锁;

//Sequence,我们写一个这个
public class Sequence {

    private MyLock lock = new MyLock(); //我们先构建一下~

    private int value;

    public int getNext(){
        lock.lock();
        value++;
        lock.unlock();

        return value;
    }

    public static void main(String[] args) {

        Sequence s = new Sequence();

        //现在,我们进行一下测试,夜光:三个线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true)
                System.out.println(s.getNext());
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true)  //我们加上一个这个
                System.out.println(s.getNext());
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true)
                System.out.println(s.getNext());
            }
        }).start();


    }

}

 

package 自旋锁死锁重入锁.可重入锁;


import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

public class MyLock implements Lock {

    //怎么判断第一个哈
    private boolean isLocked = false;

    //为了实现可重入锁
    //我们进行必要的改造
    //首先,需要记住当下的线程
    private Thread lockBy = null; //有点帅

    //锁的数量
    private int lockCount = 0;

    @Override
    public synchronized void lock() {  //我们加上这个关键词,进来的线程要等待

        Thread currentThread = Thread.currentThread();//嗯唔

        while (isLocked && currentThread != lockBy)  //只要为true,就~
            //.....
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        isLocked = true;
        lockBy = currentThread;
        lockCount++; //递增
    }

    //第一个资源执行完毕,需要释放锁
    //那么我们则

    @Override
    public synchronized void unlock() {  //synchronized必须要加上这个
        if (lockBy == Thread.currentThread()){  //如果是相等的
            lockCount--;

            if (lockCount == 0){
                notify();
                isLocked = false;
            }

        }
    }

    @Override
    public void lockInterruptibly() throws InterruptedException {

    }

    @Override
    public boolean tryLock() {
        return false;
    }

    @Override
    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
        return false;
    }


    @Override
    public Condition newCondition() {
        return null;
    }
}

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值