首页 > 编程语言 >java——线程同步机制——解决线程安全问题——同步方法

java——线程同步机制——解决线程安全问题——同步方法

时间:2022-11-20 19:36:13浏览次数:47  
标签:同步 java Thread -- RunnableImpl 线程 run ticket

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解决线程安全问题——同步方法

解决线程安全问题的二种方案:使用同步方法

使用步骤:
1.把访问了共享数据的代码抽取出来,放到一个方法中
2.在方法上添加synchronized修饰符

格式:定义方法的格式

修饰符 synchronized 返回值类型 方法名(参数列表){
        可能会出现线程安全问题的代码(访问了共享数据的代码)
    }


ublic class RunnableImpl implements Runnable{
    //定义一个多个线程共享的票源
    private static int ticket = 100;


    //设置线程任务:卖票
    @Override
    public void run() {
        System.out.println("this:"+this);//this:com.itheima.demo08.Synchronized.RunnableImpl@58ceff1
        //使用死循环,让卖票操作重复执行
        while(true){
            payTicketStatic();
        }
    }

    /*
        静态的同步方法
        锁对象是谁?
        不能是this
        this是创建对象之后产生的,静态方法优先于对象
        静态方法的锁对象是本类的class属性-->class文件对象(反射)
     */
    public static /*synchronized*/ void payTicketStatic(){
        synchronized (RunnableImpl.class){
            //先判断票是否存在
            if(ticket>0){
                //提高安全问题出现的概率,让程序睡眠
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //票存在,卖票 ticket--
                System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票");
                ticket--;
            }
        }

    }

    /*
        定义一个同步方法
        同步方法也会把方法内部的代码锁住
        只让一个线程执行
        同步方法的锁对象是谁?
        就是实现类对象 new RunnableImpl()
        也是就是this
     */
    public /*synchronized*/ void payTicket(){
        synchronized (this){
            //先判断票是否存在
            if(ticket>0){
                //提高安全问题出现的概率,让程序睡眠
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //票存在,卖票 ticket--
                System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票");
                ticket--;
            }
        }

    }
}


package com.itheima.demo08.Synchronized;

/*
    模拟卖票案例
    创建3个线程,同时开启,对共享的票进行出售
 */
public class Demo01Ticket {
    public static void main(String[] args) {
        //创建Runnable接口的实现类对象
        RunnableImpl run = new RunnableImpl();
        System.out.println("run:"+run);//run:com.itheima.demo08.Synchronized.RunnableImpl@58ceff1
        //创建Thread类对象,构造方法中传递Runnable接口的实现类对象
        Thread t0 = new Thread(run);
        Thread t1 = new Thread(run);
        Thread t2 = new Thread(run);
        //调用start方法开启多线程
        t0.start();
        t1.start();
        t2.start();
    }
}
 

标签:同步,java,Thread,--,RunnableImpl,线程,run,ticket
From: https://www.cnblogs.com/xiaobaibailongma/p/16909269.html

相关文章

  • linux 多线程 c++2
    为了在用线程分离的时候保证即使主线程退出了,子线程还能正常运行,可以使用pthread_exit(NULL)去退出主线程,这样地址空间还能正常存在线程分离是为了保证主线程不会被堵塞,还能......
  • 嵌入式软件异步编程:同步还是异步?
    异步并不总是提高效率的,那什么时候用同步,什么时候用异步呢?mingdu.zhengatgmaildotcom异步要解决的是CPU和I/O速度差异的问题,所以异步适合I/O远慢于CPU的情况,如果I/O仅稍......
  • Java使用反射生成JDK动态代理
    Java使用反射生成JDK动态代理1.*使用反射生成JDK动态代理在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成JD......
  • Java通过反射生成并操作对象
    Java通过反射生成并操作对象1.*使用反射生成并操作对象Class对象可以获得该类里的方法(由Method对象表示)、构造器(由Constructor对象表示)、Field(由Field对象表示),这3个类都......
  • Java通过反射查看类信息
    Java通过反射查看类信息1.*通过反射查看类信息Java程序中的许多对象在运行时都会出现两种类型:编译时类型和运行时类型,例如代码:“Personp=newStudent()”,这行代码将......
  • java——线程同步机制——解决线程安全问题——同步代码块
                                      解决线程安全问题——同步代码块卖票案例出现了线程安......
  • Linux下安装Java运行环境
    1.下载java8的包,并上传到服务器/usr/local目录下wget命令是一个从网络上下载文件的自由工具,它支持http协议,https协议和ftp协议。因此我们可以通过wget命令来下载JDK。wge......
  • java注解详解以及如何获取注解的上的信息
    目录一、Java自定义注解详解1.定义注解:2.元注解介绍@Target详细介绍@Relation详细介绍@Documented介绍@Inherited介绍3.注解可用的类型4.默认值限制5.创建一个简单的自定义......
  • Java中使用脚本引擎运行脚本语言
    在Java中运行脚本语言,例如JavaScript。步骤:1、创建脚本引擎管理器ScriptEngineManager2、从管理器中获取一个引擎ScriptEngine3、通过put(key,valu......
  • JAVA接口
    JDK1.8之前接口是接口,类是类。它们是同一层次的概念。接口中没有构造器。接口如何声明:interface在JDK1.8之前,接口中只有两部分内容,(1)常量:固定修饰符:publicstaticfina......