专栏首页Java患者Java基础知识(十一)--多线程

Java基础知识(十一)--多线程

多线程(同步方法)

  • 使用synchronized关键字修饰一个方法,该方法中所有的代码都是同步的
class Printer {
 public static void print1() {
  synchronized(Printer.class){    //锁对象可以是任意对象,但是被锁的代码需要保证是同一把锁,不能用匿名对象
   System.out.print("程");
   System.out.print("序");
   System.out.print("员");
   System.out.print("\r\n");
  }
 }
 /*
  * 非静态同步函数的锁是:this
  * 静态的同步函数的锁是:字节码对象
  */
 public static synchronized void print2() { 
  System.out.print("码");
  System.out.print("农");
  System.out.print("\r\n");
 }
}

多线程安全问题

  • 多线程并发操作同一数据时,就有可能出现线程安全问题
  • 使用同步技术可以解决这种问题,把操作数据的代码进行同步,不要多个线程一起操作
public class Demo2_Synchronized {

  /**
   * @param args
   * 需求:铁路售票,一共100张,通过四个窗口卖完.
   */
  public static void main(String[] args) {
   TicketsSeller t1 = new TicketsSeller();
   TicketsSeller t2 = new TicketsSeller();
   TicketsSeller t3 = new TicketsSeller();
   TicketsSeller t4 = new TicketsSeller();
   
   t1.setName("窗口1");
   t2.setName("窗口2");
   t3.setName("窗口3");
   t4.setName("窗口4");
   t1.start();
   t2.start();
   t3.start();
   t4.start();
  }
 
 }
 
 class TicketsSeller extends Thread {
  private static int tickets = 100;
  static Object obj = new Object();
  public TicketsSeller() {
   super();
   
  }
  public TicketsSeller(String name) {
   super(name);
  }
  public void run() {
   while(true) {
    synchronized(obj) {
     if(tickets <= 0) 
      break;
     try {
      Thread.sleep(10);//线程1睡,线程2睡,线程3睡,线程4睡
     } catch (InterruptedException e) {
      
      e.printStackTrace();
     }
     System.out.println(getName() + "...这是第" + tickets-- + "号票");
    }
   }
  }
 }
  • 死锁
    • 多线程同步的时候,如果同步代码嵌套,使用相同锁,就有可能出现死锁

多线程(单例设计模式)

单例设计模式: 保证类在内存中只有一个对象

如何保证类在内存中只有一个对象呢?

  • 控制类的创建,不让其他类来创建本类的对象. private
  • 提供公共的访问方式.

单例写法

//饿汉式
class Singleton {
  //1,私有构造函数
  private Singleton(){}
  //2,创建本类对象
  private static Singleton s = new Singleton();
  //3,对外提供公共的访问方法
  public static Singleton getInstance() {
    return s;
  }

  public static void print() {
    System.out.println("11111111111");
  }
}
//懒汉式,单例的延迟加载模式
class Singleton {
 //1,私有构造函数
 private Singleton(){}
 //2,声明一个本类的引用
 private static Singleton s;
 //3,对外提供公共的访问方法
 public static Singleton getInstance() {
  if(s == null)
   //线程1,线程2
   s = new Singleton();
  return s;
 }
 
 public static void print() {
  System.out.println("11111111111");
 }
}
class Singleton {
  private Singleton() {}

  public static final Singleton s = new Singleton();//final是最终的意思,被final修饰的变量不可以被更改
}

本文分享自微信公众号 - Java患者(gh_3a16ffdedb6a),作者:Zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java基础知识(十)--多线程

    用户7386338
  • Java基础知识(十二)--多线程通信

    用户7386338
  • java基础(十一):多线程

    注意:优先级低只是意味着获得调度的概率低。并不是绝对先调用优先级高后调用优先级低的线程。

    Vincent-yuan
  • Java基础知识(十三)--线程池

    用户7386338
  • Java多线程通关———基础知识

    1 线程:进程中负责程序执行的执行单元 线程本身依靠程序进行运行 线程是程序中的顺序控制流,只能使用分配给程序的资源和环境

    后端码匠
  • JAVA多线程并发的基础知识

    并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写...

    用户5640963
  • 多线程基础知识了解一下

    作为一名优秀的攻城师,了解多线程的知识非常有必要,尤其在人工智能和机器学习的热潮下,如何提高程序或者算法的运行效率是非常有价值的一件事情。

    我是攻城师
  • 多线程基础知识了解一下

    作为一名优秀的攻城师,了解多线程的知识非常有必要,尤其在人工智能和机器学习的热潮下,如何提高程序或者算法的运行效率是非常有价值的一件事情。

    我是攻城师
  • 【Java基本功】一文了解Java多线程的基础知识点

    本文介绍了Java多线程的基本概念,使用方法,以及底层实现原理。帮助你更好地使用Java的多线程。

    Java技术江湖
  • 【多线程】基础理论知识

    上一个系列是SpringCloud入门系列,以后肯定会写一期进阶系列,但是目前更新的是多线程系列。

    用户8902830
  • Java基础-多线程(一)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    cwl_java
  • java(一)基础知识

    西西嘛呦
  • Java基础知识(一)

    JRE: java Runtime Environment(java运行时环境)。即java程序的运行时环境,包含了java虚拟机,java基础类库。

    shimeath
  • 多线程基础(十三):java中的FutureTask

    可以看到,FutrueTask实现了RunnableFuture接口,而RunnableFuture接口又继承了Future和Runnable。如下图:

    冬天里的懒猫
  • java基础第十六篇之多线程

    1:线程的概念 进程(任务):一个正在运行的程序 进程的调度:CPU来决定什么时候该运行哪个进程 (时间片轮流法) 线程在一个应用程序中,同时,有多个不同...

    海仔
  • Java多线程知识点

    进程和线程的区别?多线程有什么好处? 进程:正在进行中的程序(直译)。 线程:就是进程中一个负责程序执行的控制单元(执行路径)

    六月的雨
  • Java多线程知识小抄集(一)

    本文主要整理平时遇到的Java多线程的相关知识点,适合速记,故命名为“小抄集”。本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子...

    用户1263954
  • Java基础知识(四)--多态

    当代码这个样子的时候,(也就是说当编译类型和运行类型不同)多态就产生了.对象a具有两种类型

    用户7386338
  • Java基础——多线程

      Java中多线程的应用是非常多的,我们在Java中又该如何去创建线程呢? http://www.jianshu.com/p/40d4c7aebd66 一、...

    mukekeheart

扫码关注云+社区

领取腾讯云代金券