线程安全

线程安全

线程漏洞最典型的例子就是网上售票。

new Thread(saleThread,"线程一");
new Thread(saleThread,"线程二");
new Thread(saleThread,"线程三");
new Thread(saleThread,"线程四");

上述会发生一张票被多次售出的情况。
归纳 当多线程共享一个共同资源时,会出现如上问题。
原因 线程随机性原理,即线程会被cpu随机切换。
解决方法

  1. 设置变量
    if(bool) 可访问
    if(!bool)不可访问

  2. synchronized
    同步代码块

synchronized(lock){
  操作共享资源代码块
  }

同步方法

synchronized 返回值类型 方法名([参数1,...]){
  //balalala
}
public synchronized void set(String name) {

        if (isConsume) {
            count++;
            this.name = name + count;
            System.out.println(Thread.currentThread().getName() + "生产了"+ this.name);
            isConsume = false;
        }
        //
        notify();
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void get() {
        if (!isConsume) {System.out.println(Thread.currentThread().getName() + "消费了" + name);
            isConsume = true;
        }
        notify();
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}

3.lock替换synchronized
java.util.concurrent.locks.Lock

    lock = new ReentrantLock();
    condition_producer = lock.newCondition();
    condition_consumer = lock.newCondition();

synchronized -> lock.lock();

public void set(String name) {
    lock.lock();
    try {
        //生产了
        condition_consumer.signal();
        // 消费了才出来生产
        condition_producer.await();        
    } finally {
        lock.unlock();// 必须执行!!!!!防止死锁!!
    }
}

public void get() {
    lock.lock();
    try {
         "消费了"
        condition_producer.notify();
        condition_consumer.wait();
    } finally {
        lock.unlock();
    }
}

Lock

  • void lock()
  • -

获取锁。

  • void lockInterruptibly()

如果当前线程未被中断,则获取锁。

  • Condition newCondition()

返回绑定到此 Lock 实例的新 Condition 实例。

  • boolean tryLock()

仅在调用时锁为空闲状态才获取该锁。

  • boolean tryLock(long time, TimeUnit unit)

如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。

  • void unlock()

释放锁。

wait(), notify(), notify All()

  • wait() 是当前cpu放弃同步锁并进入等待(释放cpu,释放锁),直到其他线程进入同步锁,并调用notify()或notify All()唤醒该线程为止
  • notify() 唤醒同步锁上等待的第一个调用wait()的线程
  • notify All() 唤醒同步锁上调用wait()的所有线程
    注意:
    上述三种方法必须在同步代码块或同步方法里
    必须由锁对象调用
    IllegalMonitorStateException 非法的监控异常

sleep()和wait()的区别

描述sleepwait
属于哪个类ThreadObject
是否让出cpu
是否释放锁
时间可以可以
使用要求必须在同步里面,锁对象调用
中断InterruptedException线程终止线程终止

线程状态

  • BLOCKED

受阻塞并且正在等待监视器锁的某一线程的线程状态。

    public void run() {

        synchronized (this) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    public static void main(String[] args) {
        ThreadBlocked ttw = new ThreadBlocked();
        Thread thread1 = new Thread(ttw);
        Thread thread2 = new Thread(ttw);
        thread1.start();
        thread2.start();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread2.getState());
    }
  • NEW

至今尚未启动的线程的状态。

    public void run() {}

    public static void main(String[] args) {
        Thread thread = new Thread();
        /**休眠一下 给时间切换到线程thread 否则输出主线程main的状态**/
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread.getState());
    }
  • RUNNABLE

可运行线程的线程状态。

    public void run() {}

    public static void main(String[] args) {
        Thread thread = new Thread();
        thread.start();
        System.out.println(thread.getState());
    }
  • TERMINATED

已终止线程的线程状态。

    public void run() {}

    public static void main(String[] args) {
        ThreadTerminated ttw = new ThreadTerminated();
        Thread thread = new Thread(ttw);
        thread.start();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread.getState());
    }
  • TIMED_WAITING

具有指定等待时间的某一等待线程的线程状态。

public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ThreadTimeWaiting ttw = new ThreadTimeWaiting();
        Thread thread = new Thread(ttw);
        thread.start();
        /**
         * 休眠一下 切换到线程thread 否则输出主线程main的状态
         */
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread.getState());
    }
  • WAITING

某一等待线程的线程状态。

public void run() {
        synchronized (this) {
            try {
                wait();
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }

        }
    }

    public static void main(String[] args) {
        ThreadWaiting ttw = new ThreadWaiting();
        Thread thread = new Thread(ttw);
        thread.start();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread.getState());
    }

线程池

管理线程,存放等待线程
Thread创建的线程不在线程池里面。
通过线程池创建的线程默认为后台线程,优先级默认为Normal.
执行方法execute,结束方法shutdown


优点:线程的创建与销毁都要耗费大量的时间,创建多线程也会占据大量的空间。线程池的出现不仅利于管理,还解决了上述问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本项目是一个基于SpringBoot开发的华府便利店信息管理系统,使用了Vue和MySQL作为前端框架和数据库。该系统主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者,包含项目源码、数据库脚本、项目说明等,有论文参考,可以直接作为毕设使用。 后台框架采用SpringBoot,数据库使用MySQL,开发环境为JDK、IDEA、Tomcat。项目经过严格调试,确保可以运行。如果基础还行,可以在代码基础之上进行改动以实现更多功能。 该系统的功能主要包括商品管理、订单管理、用户管理等模块。在商品管理模块中,可以添加、修改、删除商品信息;在订单管理模块中,可以查看订单详情、处理订单状态;在用户管理模块中,可以注册、登录、修改个人信息等。此外,系统还提供了数据统计功能,可以对销售数据进行统计和分析。 技术实现方面,前端采用Vue框架进行开发,后端使用SpringBoot框架搭建服务端应用。数据库采用MySQL进行数据存储和管理。整个系统通过前后端分离的方式实现,提高了系统的可维护性和可扩展性。同时,系统还采用了一些流行的技术和工具,如MyBatis、JPA等进行数据访问和操作,以及Maven进行项目管理和构建。 总之,本系统是一个基于SpringBoot开发的华府便利店信息管理系统,使用了Vue和MySQL作为前端框架和数据库。系统经过严格调试,确保可以运行。如果基础还行,可以在代码基础之上进行改动以实现更多功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值