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

  • 相关阅读:
    openCV使用
    Object-C知识点 (二) 控件的实用属性
    Linux 配置JDK + MyEclipse
    虚拟机+linux+大杂烩
    THREE.js代码备份——webgl
    THREE.js代码备份——webgl
    THREE.js代码备份——canvas_ascii_effect(以AscII码显示图形)
    THREE.js代码备份——canvas
    THREE.js代码备份——canvas_lines(随机点、画线)
    THREE.js代码备份——线框cube、按键、鼠标控制
  • 原文地址:https://www.cnblogs.com/tman/p/3977305.html
Copyright © 2011-2022 走看看