教育路上

全国站>Java>多线程>java同步方法
发布需求
填写需求信息关闭
我们会根据您的需求匹配

姓      名:

意向城市:

留      言:

手机号码:

验  证  码:  换一张

确认提交

java同步方法

摘要:java同步方法,了解到同步代码块可以有效解决线程安全问题,当把共享资源的操作放在 synchronized 定义的区域内时,Java 同步 方法。以下是我们为大家整理的,相信大家阅读完后肯定有了自己的选择吧。

2022-05-19 13:54网络推荐

发布时间:
2022-05-19 13:54
信息来源:
网络推荐
浏览次数:
242
java同步方法

通过 14.5.2 小节的学习,了解到同步代码块可以有效解决线程安全问题,当把共享资源

的操作放在 synchronized 定义的区域内时,便为这些操作加了同步锁。在方法前面同样可以

使用 synchronized 关键字来修饰,被修饰的方法为同步方法,它能实现和同步代码块同样的

功能,具体语法格式如下:

synchronized 返回值类型方法名([参数 1,……]) { }

被 synchnonied 修饰的方法在某一时刻只允许一个线程访问,访问该方法的其他线程都会发

生阻塞,直到当前线程访问完毕后,其他线程才有机会执行。

接下来使用同步方法对例 14-12 进行修改,如例 14-13 所示,

例 14-13 Example13.java

// 定义 Ticket1 类实现 Runnable 接口

class Ticket1 implements Runnable {

private int tickets = 10;

public void run() {

while (true) {

saleTicket(); // 调用售票方法

if (tickets <= 0) {

break;

}

}

}

// 定义一个同步方法 saleTicket()

private synchronized void saleTicket() {

if (tickets > 0) {

try {

Thread.sleep(10); // 经过的线程休眠 10 毫秒

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + "---卖出的票"

+ tickets--);

}

}

}

public class Example13 {

public static void main(String[] args) {

Ticket1 ticket = new Ticket1(); // 创建 Ticket1 对象

// 创建并开启四个线程

new Thread(ticket,"线程一").start();

new Thread(ticket,"线程二").start();

new Thread(ticket,"线程三").start();

new Thread(ticket,"线程四").start();

}

}

运行结果如图 14-17 所示

from shengerguan

例 14-13 中,将售票代码抽取为售票方法 saleTicket( ),并用 synchronized 关键字把 saleTieckt()

修饰为同步方法,然后在 run( )方法中调用该方法。从图 14-17 所示运行结果可以看出,同

样没有出现 0 号和负数号的票,说明同步方法实现了和同步代码一样的的效果。

思考:大家可能会有这样的疑问:同步代码块的锁是自己定义任意模型的对象,那么同步

方法是否也存在锁?如果有,它的锁是什么呢? 答案是肯定的,同步方法也有锁,它的锁就

是当前调用该方法的对象,也就是 this 指向的对象。这样做的好处是,同步方法被所有线程

共享,方法所在的对象相对于所有线程来说是唯一的,从而保证了锁的唯一性。当一个线程

执行该方法时,其他的线程就不能进入该方法中,直到这个线程执行完该方法为止,从而达

到线程同步的效果。

有时候需要同步的方法是静态方法,静态方法不需要创建对象就可以直接用“类名.方法

名()”方式调用。这时候我们就会有一个疑问,如果不创建对象,静态同步方法的锁就不

会是 this,那么静态同步方法的锁是什么?Java 中静态方法的锁是该方法所在类的 class 对

象,该对象可以直接用“类名.class”的方式获取。

同步代码块和同步方法解决多线程问题有好处也有弊端。同步解决了多个线程同时访问共

享数据时的线程安全问题,只要加上同一个锁,在同一时间内只能有一条线程执行。但是线

程在执行同步代码时每次都会判断锁的状态,非常消耗资源,效率较低。



上一篇:
java同步代码块
下一篇:
java死锁问题
标签:
网友评论
发布评论

访客的评论 2022/12/01 01:06

文中描述的是准确的吗,如何报名!

相关推荐
我也来发表评价关闭
我对该内容的评价:
0
评价500
验证码: 看不清 换一张
提交 (匿名发布,无须担心别人知道您的身份)