并发,同步锁,Runnable,Callable,Future

1.并发:  
     在我们的操作系统中,同一个时间点,有N个线程都想访问同一个程序!但是cpu只能运行一个!
  
  这种情况就是!  多个线程在 同一个时间点 访问同一个资源,会引发线程不安全的问题!
  怎么解决这种不安全的问题??
  01.设置同步代码块
  02.设置同步方法
    使用的关键字  synchronized  解决!
    
    注意点:
     01.在同一个时间点,只能有一个线程进入  synchronized代码块或者方法
     02.当一个线程访问 synchronized代码块的时候,其他的synchronized代码块也会被锁定!
     03.当一个线程访问 synchronized代码块的时候,其他的线程可以访问非synchronized修饰代码块!
    
    
    
  2.Runnable   Callable  的区别       Future接口


  01.Runnable接口中只有一个方法    public abstract void run();
             没有返回值  没有声明异常
  02.Callable接口中只有一个方法     V call() throws Exception;
             有返回值    有声明异常
  03.Callable 接口中的call()的返回值可以用 Future对象来接收
  
  
  3. Future是一种思想:
  
    1 2 3 4四个人在排队买煎饼!
    234是不是需要等待! 假如一人需要等待5分钟!
        第四个人4需要等待15分钟!
        按照我们现在讲的线程!
    123得到煎饼,4必须等待15分钟之后才能得到!
        中间4不能离开队列,4白白等待15分钟!
        
        
   Future的核心:
    1 2 3 4四个人在排队买煎饼!
       假如一人需要等待5分钟!
    4知道自己需要等待15分钟!
       这时候4可以利用这15分钟去做别的事情!
    123买完煎饼之后,4会得到通知,然后回来购买煎饼!  
4.同步锁:
/**
 * 售票的线程类   实现同步
 */
public class SynchronizedSale implements Runnable {

    // 定义总票数
    private int counts = 10000;

    // 定义出售票的下标
    private int num = 0;

    @Override
    public void run() {
        while (true) {
            /**
             * 在多个线程并发访问我们这个run()的时候
             * 只能有一个线程进入我们这个synchronized 同步代码块!
             * 第一个线程执行完毕之后,之后的线程才能进入....依次类推
             */
            synchronized (this) {
                // 如果没有票 退出循环
                if (counts <= 0) {
                    break;
                }
                counts--; // 卖了一张票
                num++;
                System.out.println(Thread.currentThread().getName() + "抢到了第"
                        + num + "张票!剩余票数:" + counts);
            }
        }
        synchronized (this) {
                //当有线程进入一个synchronized代码块时,所有 
synchronized代码块都会上锁,不能进入
        }
    }

    /**
     * 模拟3个人同时抢票
     */
    public static void main(String[] args) {
        // 实例化线程类对象
        SynchronizedSale sale = new SynchronizedSale();
        Thread t1 = new Thread(sale, "小黑");
        Thread t2 = new Thread(sale, "小白");
        Thread t3 = new Thread(sale, "小红");
        Thread t4 = new Thread(sale, "小粉");
        Thread t5 = new Thread(sale, "小蓝");
        System.out.println("开始抢票");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();

    }

}
抢票
/**
 * 售票的线程类   实现同步
 */
public class SynchronizedSaleMethod implements Runnable {

    // 定义总票数
    private int counts = 1000;

    // 定义出售票的下标
    private int num = 0;

    // 定义一个标识
    private boolean flag = false;

    @Override
    public void run() {
        while (!flag) {
            sale(); // 只要还有票 循环的调用卖票的方法
        }
    }

    // 同步方法
    public synchronized void sale() {
        // 如果没有票 退出循环
        if (counts <= 0) {
            flag = true;
            return;
        }
        counts--; // 卖了一张票
        num++;
        System.out.println(Thread.currentThread().getName() + "抢到了第" + num
                + "张票!剩余票数:" + counts);
    }

    /**
     * 模拟5个人同时抢票
     */
    public static void main(String[] args) {
        // 实例化线程类对象
        SynchronizedSaleMethod sale = new SynchronizedSaleMethod();
        Thread t1 = new Thread(sale, "小黑");
        Thread t2 = new Thread(sale, "小白");
        Thread t3 = new Thread(sale, "小红");
        Thread t4 = new Thread(sale, "小粉");
        Thread t5 = new Thread(sale, "小蓝");
        System.out.println("开始抢票");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();

    }

}
抢票

 

转载于:https://www.cnblogs.com/wwlw/p/7535730.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值