同步机制二:同步方法

简介: 同步机制二:同步方法

同步机制二:同步方法

WindowTest3类

package com.day0206_1;
/**
 * 使用同步方法解决实现Runnable接口的线程的安全问题
 *
 * 1.关于同步方法仍然涉及到同步监视器,只是不需要我们显示的声明。
 * 2.非静态的同步方法,同步监视器是:this。
 *     静态的同步方法,同步监视器是:当前类本身。
 *
 */
class Window3 implements Runnable{
    private  int ticket=100;
    @Override
    public void run() {
        while(true){
               show();
        }
    }
    private synchronized void show(){//同步监视器:this
//        synchronized(this) {
            if (ticket > 0) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + ":" + "买票,票号为:" + ticket);
                ticket--;
            }
//        }
    }
}
public class WindowTest3 {
    public static void main(String[] args) {
        Window3 w=new Window3();
        Thread t1 = new Thread(w);
        Thread t2 = new Thread(w);
        Thread t3 = new Thread(w);
        t1.setName("窗口一");
        t2.setName("窗口二");
        t3.setName("窗口三");
        t1.start();
        t2.start();
        t3.start();
    }
}

WindowTest4类

package com.day0206_1;
/**
 * 使用同步方法解决继承Thread类的方式中的线程安全问题
 *
 *
 */
class Window4 extends Thread{
    private static int ticket=100;
    @Override
    public void run() {
        while(true){
                show();
        }
    }
    private static synchronized void show(){//同步监视器:Window4.class
//        private synchronized void show(){//同步监视器:t1、t2、t3。此种解决方式是错误的
        if (ticket > 0) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ":" + "买票,票号为:" + ticket);
            ticket--;
        }
    }
}
public class WindowTest4 {
    public static void main(String[] args) {
        Window4 t1=new Window4();
        Window4 t2=new Window4();
        Window4 t3=new Window4();
        t1.setName("窗口一");
        t2.setName("窗口二");
        t3.setName("窗口三");
        t1.start();
        t2.start();
        t3.start();
    }
}
相关文章
|
前端开发 C++
10分钟,带你掌握C++多线程同步!
本文介绍了C++11中如何开启新线程,并详细讲解了线程的基础同步原语。如何采用async, packaged_task和promise实现future同步机制?怎样处理spurious wakeup?本文以质数判定服务为例为大家分享C++多线程同步措施!
13014 0
同步机制一:同步代码块
同步机制一:同步代码块
69 0
|
安全 Windows
【线程安全问题】线程互斥与线程同步技术(上)
【线程安全问题】线程互斥与线程同步技术
【线程安全问题】线程互斥与线程同步技术(上)
|
安全 算法 Linux
【多线程中的线程安全问题】线程互斥
【多线程中的线程安全问题】线程互斥
177 0
|
安全 程序员
【线程安全问题】线程互斥与线程同步技术(下)
【线程安全问题】线程互斥与线程同步技术
|
安全 Java
同步代码块、同步方法解决数据安全问题、线程安全的类及Lock锁
同步代码块、同步方法解决数据安全问题、线程安全的类及Lock锁的简单示例
119 1
3.8~3.14 线程同步
3.8~3.14 线程同步
91 0
3.8~3.14 线程同步
|
安全 算法 Linux
Linux多线程:线程安全、线程互斥、死锁、线程同步
Linux多线程:线程安全、线程互斥、死锁、线程同步
168 0
|
安全 Java
多线程编程之线程的同步机制(上): Synchronized同步方法
多线程中的同步,指的是如何开发出线程安全的程序或者应用,也就是得解决非线程安全所带来的一些相关问题-----脏读。
194 0
多线程编程之线程的同步机制(上): Synchronized同步方法