zoukankan      html  css  js  c++  java
  • java 09 06 thread-同步代码块-同步方法

    ------------------------------------------------

        任何一个对象都可以是锁。信号灯,同一个参照物。

       同步代码块

              synchronized(lock){...}

       同步方法:非静态同步方法以当前对象作为锁旗标

          public synchronized void xxx(){...}

       同步方法:静态同步方法以类作为锁旗标

         public static synchronized void xxx(){...}

    售票

    ---------------------------------------------

    数据访问:同时卖100张票

    线程安全:

    class NineThreadDemo4Sale{
    public static void main(String[] agrs) {
    Saler s1 = new Saler("张");
    Saler s2 = new Saler("王");
    s1.start();
    s2.start();
    }
    }
    class Saler extends Thread{
    //静态跟对象无关
    static int ticket=100;
    private String name;
    public Saler( String name){
    this.name=name;
    }

    //run 方法
    public void run(){
    //循环
    while(ticket>0){
    //得到当前票号
    int currticket =ticket;
    //还剩多少张票
    ticket=ticket-1;
    System.out.println(name +";"+currticket);
    }
    }
    }

    锁买票

    ----------------------------------------------------------

    class NineThreadDemo4Sale{
    public static void main(String[] agrs) {
    Saler s1 = new Saler("张");
    Saler s2 = new Saler("王");
    s1.start();
    s2.start();
    }
    }

    class Saler extends Thread{
    //静态跟对象无关
    //定义一个对象锁 只要它锁上 别人就要等待
    static Object lock = new Object();
    static int ticket=100;
    private String name;
    public Saler( String name){
    this.name=name;
    }

    //run 方法
    public void run(){
    //循环
    while(ticket>0){
    //锁的用法,synchronized获得锁定权,同一时刻只能有一个人上锁
    synchronized(lock){
    //得到当前票号
    int currticket =ticket;
    //还剩多少张票
    ticket=ticket-1;
    }
    System.out.println(name +";"+currticket);

    }
    }


    }

    锁 取票

    ------------------------------------

    class NineThreadDemo4Sale{
    public static void main(String[] agrs) {
    Saler s1 = new Saler("==>张");
    Saler s2 = new Saler("=====>王");
    s1.start();
    s2.start();
    }
    }

    class Saler extends Thread{
    //静态跟对象无关
    //定义一个对象锁 只要它锁上 别人就要等待
    static Object lock = new Object();
    static int ticket=100;
    private String name;
    public Saler( String name){
    this.name=name;
    }

    //run 方法
    public void run(){
    while(true){
    int tick = getticket();
    if(tick >0){
    System.out.println( name +":"+tick);
    }
    else{
    return;
    }
    }

    }

    //取票动作
    public int getticket(){

     //同步代码块
    synchronized(lock){
    int currticket =ticket;
    ticket --;
    return currticket;
    }
    }

    }

    //同步方法---------------------------------------------------

    -----------------------------------------------------------------

    class NineThreadDemo4Sale{
    public static void main(String[] agrs) {
    Saler s1 = new Saler("==>张");
    Saler s2 = new Saler("=====>王");
    s1.start();
    s2.start();

    }

    class Saler extends Thread{
    //静态跟对象无关
    //定义一个对象锁 只要它锁上 别人就要等待
    //static Object lock = new Object();
    static int ticket=100;
    private String name;
    public Saler( String name){
    this.name=name;
    }  

    //run 方法
    public void run(){
    while(true){
    int tick = getticket();
    if(tick >0){
    System.out.println( name +":"+tick);
    }
    else{
    return;
    }
    }
    }

     //同步方法(锁为当前对象作为锁 ,三个Saler 每个Saler 都以自己为锁,所以要用static 修饰,静态的方法就以类作为锁)
    public static synchronized int getticket(){

    int currticket =ticket;
    ticket --;
    return currticket;
    }

    }

    票池取票-------------------------------------

    -------------------------------------------------

    class NineThreadDemo6tick{
    public static void main(String[] agrs) {
    TicketPool pool=new TicketPool();
    Saler s1=new Saler("LILI" , pool);
    Saler s2=new Saler("MARRY" , pool);
    s1.start();
    s2.start();
    }

    }
    //票池
    class TicketPool{
    private int tickets =100;
    public synchronized int Getticks(){
    //票号
    int tick =tickets;
    //票数
    tickets --;
    return tickets;
    }
    }
    //并发线程
    class Saler extends Thread{
    //所有的售票员从一个票池售票。声明一个变量,传过来票池。
    private TicketPool pool ;
    private String name;
    //构造函数
    public Saler(String name, TicketPool pool){
    this.name =name;
    this.pool =pool;
    }

    public void run(){
    while(true){
    ////调用取票的方法
    int no =pool.Getticks();
    if(no>0){
    System.out.println(name+":"+no);
    }
    else{
    return;
    }
    }
    }
    }

  • 相关阅读:
    苹果快速的修复了Mac OS High Sierra 上出现了root的漏洞
    Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task
    2018CHD-ACM新生赛(正式赛)E.解救迷茫的草滩小王子
    2018CHD-ACM新生赛(正式赛)D.刀塔大师lwq I
    2018CHD-ACM新生赛(正式赛)C.绝望のRevue
    最小生成树——克鲁斯克算法+一道例题
    求连通分量个数+判定二分图
    动态规划——滚动数组(省内存)
    [BZOJ 1491] [NOI 2007] 社交网络
    SPOJ 8222 Substrings 后缀自动机
  • 原文地址:https://www.cnblogs.com/simly/p/10523543.html
Copyright © 2011-2022 走看看