Java多线程之synchronized关键词(Demo详解)

Java基础知识总结 专栏收录该内容
80 篇文章 9 订阅

你好我是辰兮,很高兴你能来阅读,本篇文章为大家讲解Java多线程之synchronized关键词,下面有案例的截图和相关代码可以自行实践,相关的更多面试知识已经提前整理好文章可以阅读学习,分享获取新知,希望对Java初学者有帮助。



一、序言

多线程访问临界资源时的数据安全问题

产生原因:有多个线程在同时访问一个资源,如果一个线程在取值的过程中,时间片又被其他线程抢走了,临界资源问题就产生了


how to解决临界资源问题

解决方案:一个线程在访问临界资源的时候,如果给这个资源“上一把锁”,这个时候如果其他线程也要访问这个资源, 就得在“锁”外面等待


对象锁:任意的对象都可以被当做锁来使用
类锁:把一个类当做锁,语法为:类名.class


同步代码块

语法:
synchronized() { 
//需要访问临界资源的代码段 
}

说明:

  • a.程序走到代码段中,就用锁来锁住了临界资源,这个时候,其他线程不能执行代码段中的代码,只能在锁外边等待
  • b.执行完代码段中的这段代码,会自动解锁。然后剩下的其他线程开始争抢cpu时间片
  • c.一定要保证不同的线程看到的是同一把锁,否则同步代码块没有意义.

synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
  3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
  4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

在这里插入图片描述


二、同步代码块和对象锁的使用

在这里插入图片描述

在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。

同步代码块结合对象锁

在这里插入图片描述

  • 参考代码如下,大家自行运行实践(ps:可以去除 synchronized关键字)
package demo1;

public class SellTickets {
    static int count = 10;

    //任何对象都可以充当一个对象锁
    static Object obj = new Object();
    static Runnable r = new Runnable() {
      @Override
      public void run() {
          while(count > 0) {
              System.out.println(Thread.currentThread().getName()+"--");
              synchronized(obj){
                  count--;
                  if(count <= 0) {
                      return;
                  }
                  System.out.println(Thread.currentThread().getName() + "售出了 一张票,剩余" + count);
                  
              }
          }
      }
  };
    public static void main(String[] args) {
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        Thread t3 = new Thread(r);
       // t1.setPriority(8);
        t1.start();
        t2.start();
        t3.start();
      }
}

三、同步代码块和类锁的使用

  • 使用类锁的案例如下,参考格式 即 类.class

在这里插入图片描述


四、 同步方法

  • 首先给大家展示没有加锁的方法

在这里插入图片描述

  • 然后再给大家展示加锁的方法

在这里插入图片描述

  • 参考代码如下,大家自行运行实践(ps:可以去除 synchronized关键字)
package demo1;

public class SellTickets {
    static int count = 100;
    //任何对象都可以充当一个对象锁
    //static Object obj = new Object();
    static Runnable r = new Runnable() {
      @Override
      public void run() {
          while(count > 0) {
           sellTickets();
          }
      }
        //同步方法,作用和同步代码块一样
        public synchronized void sellTickets() {
            if (count <= 0) {
                return;
            }
            count--;
            System.out.println("售票员" + Thread.currentThread().getName() + "售出一张票,余额 为" + count);
        }
    };
    public static void main(String[] args) {
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        Thread t3 = new Thread(r);
       // t1.setPriority(8);
        t1.start();
        t2.start();
        t3.start();
      }
}

The best investment is to invest in yourself

在这里插入图片描述

2020.05.31 记录辰兮的第72篇博客

  • 6
    点赞
  • 6
    评论
  • 15
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

用Intelligent Character Recognition (ICR)、Optical Character Recognition (OCR)、Optical Mark Recognition (OMR)和Magnetic Ink Character Recognition (MICR)来构建功能强大的窗体处理程序。Smartscan Xpress ICR/OCR/OMR/MICR包括广泛的图像清除选项、窗体识别以及在用户定义窗体上自动按区域处理。可以使用可配置的速率设置。 性能: · 开发环境:Win32可视开发环境。 · 范例代码包括:.NET, VB, Delphi, VC++, HTML。 · 通过ATL来确保最小的占用系统资源,而且无需MFC。 · 在.NET中作为一个管制控件来配置(见The Pegasus Imaging Dot Net Philosophy) 。 · 能够用于任何接纳ActiveX/COM控件的开发环境中。 · 使用系统包括的CAB文件或者创建一个自定义文件。 · 能够读取以下字符:手写体(hand-printed)大小写字母/数字、标准体(machine-printed)大小写字母/数字、字符标志以及MICR。 · 窗体识别用于从一个引用数据库中对窗体进行添加或删除,以及基于行结构来识别窗体 · 扫描结果返回为字符串和可信度(confidence level)。 · ICR 中支持的语言包括:英语(包括American 和European)、德语、法语、土耳其语、葡萄牙语和俄语。 · 通过程序选择需要分析的窗体中的区域并读取这些区域中的字符。 · 窗体设计工具。 · 超过27种滤镜效果,包括消除斑点、填充白色或黑色水平、垂直缝隙、强化暗区和强化亮区。 · 在任何方向镜像、交换、放大、平滑、反色显示、移动,从0到89度水平方向剪辑图像以及对图像进行任何角度的旋转 · 专用图案(Proprietary pattern)识别技术结合带有神经网络的统计法提高了识别质量 · 在一个图像或其中指定的区域中自动化检测并报告所有字符、自动化检测方向(横向/纵向)、扶正(deskew)图像并从图像中删除线条。 · 特殊阅读区 – 检测并清除图像中的圆圈。 · 窗体注册 – 在图像周围生成一个白色的边并自动删除黑色的边。 · 以每秒三百字符的速度读取手工印刷的数字(以Intel Pentium II 300 MHz为标准进行测量)。 · 如果只用于测试OCR,你需要下载ICR/OCR/OMR/MICR工具包并将分类器。(classifier)设置为";machine print";。如果你只购买了OCR工具包则不具备该功能。 · 提供性能完好的可即时下载的免费试用版本。
©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值