博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程的同步
阅读量:4358 次
发布时间:2019-06-07

本文共 2759 字,大约阅读时间需要 9 分钟。

package com.yanan.java1;import java.util.Objects;/** * Created by zhangyanana    on 2017/3/1. *///使用实现Runnable接口的方式,售票    /*此程序存在线程安全的问题,打印车票的时候,会出现重票或错票    * 1.线程安全问题存在的原因?    *   由于一个线程在操作共享数据的过程中,未执行完的情况下,另外的线程参与进来,导致共享数据存在了问题。    * 2.如何解决线程的安全问题?    *   必须让一个线程操作共享数据完毕后,其他线程才有机会参与共享数据的操作    * 3.java如何实现线程的安全问题,线程的同步机制    *       方式一:同步代码块    *           synchronized(同步监视器){    *               //需要被同步的代码块(即为操作共享数据的代码)    *           }    *           1.共享数据:多个线程共同操作的同一个数据(变量)    *           2.同步监视器:由一个类对象来充当(任何类的对象都可以充当锁)。哪个线程获取此监视器,谁就执行{}里面被同步的代码。俗称:锁    *           3.要求:所有的线程必须公用一把锁(锁只能用一把)    *           注:在实现的方式中,考虑同步的话,可以用this来充当锁;在继承的方式中慎用    *    *    *       方式二:同步方法    *           将操作共享数据的方法生命为synchronized.即此方法为同步方法,    *           能够保证当其中一个线程执行此方法时,其他线程在外等待直至执行完此方法    *           同步方法的锁:this(当前对象)    *    * 4.线程的同步的弊端:由于同一时间只能有一个线程访问共享数据,效率变低了    * * */class Window1 implements Runnable {    //共享数据ticket 和 obj对象    int ticket = 100;    Object obj = new  Object();    public void run() {        synchronized (obj) {            while (ticket > 0) {                try {                    Thread.currentThread().sleep(10);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println(Thread.currentThread().getName() + ":" + ticket--);            }        }    }}public class TestWindow1 {    public static void main(String[] args) {        Window1 w1 = new Window1();        //各个线程共享同一个对象w1        Thread t1 = new Thread(w1);        Thread t2 = new Thread(w1);        Thread t3 = new Thread(w1);        t1.start();        t2.start();        t3.start();    }}

 

package com.yanan.java1;/** * Created by zhangyanana    on 2017/3/1. *///方式二 : 同步方法/*             即此方法为同步方法将操作共享数据的方法生命为synchronized.即此方法为同步方法,               能够保证当其中一个线程执行此方法时,其他线程在外等待直至执行完此方法               同步方法的锁:this(当前对象)*/class Window4 implements Runnable {    //共享数据ticket 和 obj对象    int ticket = 100;    Object obj = new Object();    public void run() {        while (true) {            show();        }    }    //把方法声明为同步的    public synchronized void show() {        if (ticket > 0) {            try {                Thread.currentThread().sleep(10);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(Thread.currentThread().getName() + ":" + ticket--);        }    }}public class TestWindow4 {    public static void main(String[] args) {        Window4 w = new Window4();        //各个线程共享同一个对象w1        Thread t1 = new Thread(w);        Thread t2 = new Thread(w);        Thread t3 = new Thread(w);        t1.start();        t2.start();        t3.start();    }}

 

转载于:https://www.cnblogs.com/zhyn-BeHard/p/6488828.html

你可能感兴趣的文章
CSS
查看>>
Ubuntu 11.04安装GCC 4.6.1
查看>>
甲骨论
查看>>
C# 集合类-接口
查看>>
InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序)
查看>>
基于visual Studio2013解决面试题之1004最长等差数列
查看>>
联系方式
查看>>
基于visual Studio2013解决C语言竞赛题之0707月份输出
查看>>
【leetcode】Triangle
查看>>
PostgreSQL9.1 with PostGIS 2.1.4 for mapping coordinates on linux/ubuntu 已经打包成deb 可下载...
查看>>
[LeetCode] Max Consecutive Ones
查看>>
redis缓存本地安装教程
查看>>
ALTER AVAILABILITY GROUP (Transact-SQL)
查看>>
探究X Window System运行原理与启动过程
查看>>
Arch 安装 gnome桌面
查看>>
SpringCloud学习笔记(9)----Spring Cloud Netflix之声明式 REST客户端 -Feign的使用
查看>>
Python的平凡之路(17)
查看>>
Git for Windows之使用SSH协议开通公钥免密登陆功能
查看>>
Identity Server4学习系列一
查看>>
计算机硬件-基础
查看>>