首页 > 编程语言 >Java基础 同步方法

Java基础 同步方法

时间:2023-10-27 21:00:04浏览次数:32  
标签:同步 Java Thread new ticket 方法 public

同步代码块 就是 把一段代码给锁起来,这样就可以解决多线程操作共享数据时带来的数据安全问题

但是如果我们想要把一个方法里面所有的代码全都锁起来,就没有必要用同步代码块了,我们可以直接把 synchronized 加在方法上,这个方法就叫做同步方法

 

同步方法的格式:

修饰符  synchronized  返回值类型  方法名 (方法参数)  {......} 

 

同步方法的特点:

1. 同步方法是锁住方法里面所有的代码

2. 锁对象不能自己指定,是 Java 已经规定好的

如果当前的方法是非静态的,锁对象是 this,就是当前方法的调用者

如果当前的方法是静态方法,锁对象就是 当前类的字节码文件对象

 

究竟要把什么样的代码写到同步方法当中?

技巧:先不要写同步方法,先写同步代码块,再把同步代码块里面的代码抽取成方法

 

代码示例:

1. 先写成同步代码块的形式:

package pojo;

public class Ticket implements Runnable{
public Integer ticket = 1;

@Override
public void run() {
while (true) {
synchronized (Ticket.class) {
if(this.ticket > 100)
break;
Thread thread = Thread.currentThread();
System.out.println(thread.getName() + "@" + "第" + this.ticket + "张票");
this.ticket++;
}
}

}
}
----------------------------------------------------------
public static void main(String[] args) throws Exception {
Ticket ticket = new Ticket();
Thread t1 = new Thread(ticket);
Thread t2 = new Thread(ticket);
Thread t3 = new Thread(ticket);
t1.start();
t2.start();
t3.start();
}

2. 改写成同步方法:把同步代码块里面所有代码都放到方法当中

package pojo;

public class Ticket implements Runnable{
public Integer ticket = 1;

@Override
public void run() {
while (true) {
if (method()) break;
}
}

private synchronized boolean method() {
if(this.ticket > 100)
return true;
Thread thread = Thread.currentThread();
System.out.println(thread.getName() + "@" + "第" + this.ticket + "张票");
this.ticket++;
return false;
}
}
---------------------------------------------------------------------------------------
public static void main(String[] args) throws Exception {
Ticket ticket = new Ticket();
Thread t1 = new Thread(ticket);
Thread t2 = new Thread(ticket);
Thread t3 = new Thread(ticket);
t1.start();
t2.start();
t3.start();
}

 

标签:同步,Java,Thread,new,ticket,方法,public
From: https://www.cnblogs.com/gagaya2/p/17793104.html

相关文章

  • 学习如何新建java项目
    java的程序的运行机制编译型:全局翻译解释型:实时更新 在idea写下hello,world[破解激活码] IDEA2023.2.3最新激活码,注册码(亲测好用)-异常教程(exception.site) 新建一个文件夹 在文件夹新建一个class  Java语法创建一个新项目(重要)project->Empty......
  • Java基础 同步代码块
    同步代码块:利用同步代码块把操作共享数据的代码给锁起来,让同步代码块里面的代码是轮流去执行的 格式:synchronized(锁对象){   操作共享数据的代码} 细节:1.在最初,锁的状态是默认打开的,如果有一个线程进去了,锁就会自动关闭2.当锁里面全部代码都执行完毕了,线程......
  • [ApacheCommon组件使用-IO]关于JavaIO,相当输入的一个工具就是ApacheCommon-IO
    1.首先,如果你使用的是maven或者gradle建立的项目,maven只需要<!--https://mvnrepository.com/artifact/commons-io/commons-io--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId>......
  • aardio调用java语言
    一、引入java默认只要在aardio中调用importjava;就会自动搜索系统可用的JRE,如果没有找到JRE,会自动导入java.jre.v8扩展库,并自动安装OpenJDKJREv8 。注:如果系统已经安装了java6,就会用系统自带的java6,而不会自动安装OpenJDKJREv8。项目经验:项目开发过程中就遇......
  • JavaSeript在发送AJAX请家时,URL的域名地址是使用绝对地址还是相对地呲?
    在发送AJAX请求时,URL的域名地址可以使用绝对地址或相对地址。绝对地址包含完整的协议、域名和路径,例如:http://example.com/api/data。这种方式适用于需要请求不同域名下的数据的情况。使用绝对地址时,可以确保请求准确地发送到指定的服务器。相对地址只包含相对于当......
  • javaweb学习每日总结-第七天
    第七天学习Mvn模式和三层架构今天回顾了开发的三层框架,做了一个完成一点的小案例,也是亲自感受了一下做项目的一个大概的流程,想要清楚的做完一个项目,那么对流程的安排是至关重要的,下面说说我个人的理解,首先是关注数据库,没有数据一切白搭,在数据库里建好所需的表是第一步,第二步则是......
  • Java基础 线程的生命周期
      1.当创建线程对象的时候,是新建状态2.新建完之后调用start()方法就变成了就绪状态(是在调用完了start()方法之后才变成了就绪状态)。在就绪状态下,线程开始抢夺CPU的执行权。注意是正在抢,还没有抢到,没抢到就无法执行代码。所以就绪状态有执行资格,但没有执行权(有执行......
  • 获取Java21所有启动参数及默认值
    各版本获取启动参数命令:java-XX:+PrintFlagsFinal-version>jvm_flags.txt所有参数:[Globalflags]intActiveProcessorCount=-1{product}{default}uintxAdaptiveSizeDecrementScaleFactor......
  • 结合大学四年经验,带你揭秘高效自学Java的方法和路线(从认识、方法、反馈3个角度出发)
    前言大家好,我是bigsai好久不见,甚是想念,本文就自学Java的n个问题和n个方法做出一些建议,并且推荐了一条自学Java的路线,比较适合一些新入门的小白。无论你是大学生还是在职人员,想学Java时,都会面临两个选择,自学或者报班。报班通常太费钱,时间又不自由;自学又不知道如何下手,担心自己坚持......
  • 新手教程系列:群晖 Synology Drive教程,如何实现文件同步与备份?
    SynologyDrive是群晖NAS的一款文件同步和共享工具,提供了非常完善的功能,您可以轻松地对文件进行分类、归档、共享等操作,也可以在多个设备之间同步文件、备份文件、共享文件,包括电脑、手机、平板等设备。总的来说,使用SynologyDrive的好处是可以方便快捷地在不同设备之间同步文件,保......