线程--同步代码块、同步方法实例
  HvTJUzsxOBtS 2023年11月25日 13 0


1、同步代码块

作用:开启四个线程共同操作卖10张票

1.1、代码
package com.example;

import com.sun.org.apache.xerces.internal.parsers.CachingParserPool;

public class MySyncThread {
    public static void main (String [] args){
        Ticket ticket = new Ticket();  //创建Ticket对象
        //创建并开启四个线程
        new Thread(ticket,"线程1").start();
        new Thread(ticket,"线程2").start();
        new Thread(ticket,"线程3").start();
        new Thread(ticket,"线程4").start();
    }
}


//定义Ticket类实现Runnable接口
class Ticket implements Runnable{
    private int ticket = 10;  // 定义变量tickets,并赋值10
    Object lock =new Object();//定义任意一个对象,用作同步代码块的锁
    @Override
    public void run() {
    while(true){
    synchronized (lock){  //定义同步代码快
        try{
            Thread.sleep(10);  //经过10S线程休眠
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        if(ticket >0){

            System.out.println(Thread.currentThread().getName()+"---卖出的票"+ticket--);
        }else{
            break;
        }
    }
}
    }

}
1.2、运行结果

线程1—卖出的票10
线程1—卖出的票9
线程1—卖出的票8
线程1—卖出的票7
线程4—卖出的票6
线程2—卖出的票5
线程3—卖出的票4
线程1—卖出的票3
线程1—卖出的票2
线程1—卖出的票1

当多个线程使用一个共享资源时,可以将处理共享资源的代码放置在一个代码块中,使用synchronized关键字修饰,被成为同步代码块,其格式如下:
synchronized(lock){
操作共享资源代码块
}

2、同步方法
2.1、代码
package com.example;
//创建一个线程类
class Ticket implements  Runnable{
    private int ticket = 10;
        @Override
        public void run () {
            while (true) {
                if(ticket > 0) {
                    sellticket(ticket);
                    ticket--;
                }else{
                    break;
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }
     //在前面修饰synchronized说明是一个同步的方法
   synchronized  private void sellticket(int ticket) {
   System.out.println(Thread.currentThread().getName()+"卖出的票号是:"+ticket);
   }
}

public class MySyncThreadMethod {
    public static void main (String [] args){
        Ticket ticket = new Ticket(); //创建一个ticket对象
        //开启四个线程
        new Thread(ticket,"Thread_1").start();
        new Thread(ticket,"Thread_2").start();
        new Thread(ticket,"Thread_3").start();
        new Thread(ticket,"Thread_4").start();
    }
}
2.2、运行结果:

Thread_1卖出的票号是:10
Thread_2卖出的票号是:9
Thread_3卖出的票号是:8
Thread_4卖出的票号是:7
Thread_1卖出的票号是:6
Thread_3卖出的票号是:5
Thread_2卖出的票号是:5
Thread_4卖出的票号是:3
Thread_1卖出的票号是:2
Thread_3卖出的票号是:1

同被synchronized关键字修饰的一样,被修饰的方法为同步方法:
synchronized 返回值类型 方法名([参数1],“`){}

参考文档:
Java基础入门 传智博客高教产品研发部 

本人郑重声明,本博客所著文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若以上文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月25日 0

暂无评论

推荐阅读
HvTJUzsxOBtS