前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础知识(十一)--多线程

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

作者头像
用户7386338
发布2021-06-22 18:27:29
1970
发布2021-06-22 18:27:29
举报
文章被收录于专栏:Java患者Java患者

多线程(同步方法)

  • 使用synchronized关键字修饰一个方法,该方法中所有的代码都是同步的
代码语言:javascript
复制
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");
 }
}

多线程安全问题

  • 多线程并发操作同一数据时,就有可能出现线程安全问题
  • 使用同步技术可以解决这种问题,把操作数据的代码进行同步,不要多个线程一起操作
代码语言:javascript
复制
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
  • 提供公共的访问方式.

单例写法

代码语言:javascript
复制
//饿汉式
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");
  }
}
代码语言:javascript
复制
//懒汉式,单例的延迟加载模式
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");
 }
}
代码语言:javascript
复制
class Singleton {
  private Singleton() {}

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java患者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多线程(同步方法)
    • 多线程安全问题
      • 多线程(单例设计模式)
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档