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

  • 相关阅读:
    SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)
    HttpWatch工具简介及使用技巧
    橙色在网页设计运用:36个启发灵感的案例
    JS Date格式化为yyyyMMdd类字符串
    60款很酷的 jQuery 幻灯片演示和下载
    浅谈SQL Server中统计对于查询的影响
    C#创建Windows Service(Windows 服务)基础教程
    使用分页方式读取超大文件的性能试验
    240多个jQuey插件
    ASP.NET性能优化之负载均衡
  • 原文地址:https://www.cnblogs.com/tman/p/3977305.html
Copyright © 2011-2022 走看看