zoukankan      html  css  js  c++  java
  • Java线程的同步

    为什么要在线程里面使用同步 - synchronized

    首先看个列子:

    假设系统里面有5张票,有个卖票的系统,执行完,打印的结果是这样的:

    public class RunDemo05 implements Runnable {

    private int count = 5;

    public void run()
    {
    for(int i=0;i<10;i++)
    {
    sale();
    }
    }

    public void sale(){
    if (count>0)
    {
    try{

    Thread.sleep(1000);
    }
    catch(Exception e){

    e.printStackTrace();
    }
    System.out.println(count--);
    }
    }
    public static void main(String[] args) {

    RunDemo05 r = new RunDemo05();
    Thread t1 = new Thread(r);
    Thread t2 = new Thread(r);
    Thread t3 = new Thread(r);
    t1.start();
    t2.start();
    t3.start();
    }

    }

    结果:

    5
    3
    4
    2
    1
    2

    出现这样的原因: 在同一时刻有多个线程访问count数据,所以导致这种结果。

    synchronized可以解决这个问题,它是的系统里面的某一时刻只有一个线程在运行。

    synchronized的使用方法: 1. 使用synchronized方法 2. 使用synchronized程序块

    package com.pwc.thread;

    public class RunDemo05 implements Runnable {

    private int count = 5;

    public void run()
    {
    for(int i=0;i<10;i++)
    {
    sale();
    }
    }

    public synchronized void sale(){
    if (count>0)
    {
    try{

    Thread.sleep(1000);
    }
    catch(Exception e){

    e.printStackTrace();
    }
    System.out.println(count--);
    }
    }
    public static void main(String[] args) {

    RunDemo05 r = new RunDemo05();
    Thread t1 = new Thread(r);
    Thread t2 = new Thread(r);
    Thread t3 = new Thread(r);
    t1.start();
    t2.start();
    t3.start();
    }

    }

    结果:

    5
    4
    3
    2
    1

    使用synchronized程序块:

    package com.pwc.thread;

    public class RunDemo05 implements Runnable {

    private int count = 5;

    public void run()
    {
    for(int i=0;i<10;i++)
    {
    sale();
    }
    }

    public void sale(){
    synchronized(this){
    if (count>0)
    {
    try{

    Thread.sleep(1000);
    }
    catch(Exception e){

    e.printStackTrace();
    }
    System.out.println(count--);
    }
    }
    }
    public static void main(String[] args) {

    RunDemo05 r = new RunDemo05();
    Thread t1 = new Thread(r);
    Thread t2 = new Thread(r);
    Thread t3 = new Thread(r);
    t1.start();
    t2.start();
    t3.start();
    }

    }

    结果:

    5
    4
    3
    2
    1

  • 相关阅读:
    WINDOWS操作系统各种版本(转)
    等待的日子
    多媒体大赛决赛纪事
    如何使用nero刻录数据光盘(转)
    无法显示隐藏文件的方法
    2007年教育技术学专业硕士点招生简章
    教育学专业基础综合推荐教材
    .NET 的发展与变迁
    Windows XP SP3与Vista SP1,谁更强?
    2007年教育学专业基础综合考试大纲
  • 原文地址:https://www.cnblogs.com/tman/p/3977305.html
Copyright © 2011-2022 走看看