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

  • 相关阅读:
    create_project.py报错问题,建议用回python2.7
    windows下执行build_native.sh报权限问题
    编辑器CocoStudio和CocosBuilder的对比
    双击判断
    Web文件的ContentType类型大全
    Java四类八种数据类型
    自己写的通过ADO操作mysql数据库
    使用Cout输出String和CString对象
    CString和string头文件
    C++连接mysql数据库的两种方法
  • 原文地址:https://www.cnblogs.com/tman/p/3977305.html
Copyright © 2011-2022 走看看