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

  • 相关阅读:
    window打开服务的dos命令
    struts(三) ---OGNL的学习和理解
    struts(二) ---中参数传值
    struts入门初步(一)
    javaSE之Object及hashcode等相关知识
    CSS小三角制作
    VM安装mac及dmg文件转换iso
    单例模式的学习与简单应用
    Tortoise 下修改服务器路径(Relocate与Switch)
    连接未关闭。 连接的当前状态为打开。问题的解决
  • 原文地址:https://www.cnblogs.com/tman/p/3977305.html
Copyright © 2011-2022 走看看