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

    • 在本类中定义一个本来的对象,Singleton s

    • 提供公共的访问方式.

  • 单例写法

    //饿汉式
    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】即可获取最新零基础Java视频资料

回复 【激活】即可获取IDEA、datagrip等系统激活方式

回复 【面试题】即可获取Java技术相关面试题

往期 · 精彩

专注分享Java技术,跟我一起学习吧

长按识别二维码关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值