Java线程及同步(synchronized)样例代码 [转]

原创 2004年10月11日 16:50:00
 import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;

public class TestThread extends Thread
{
    private static Integer threadCounterLock; //用于同步,防止数据被写乱
    private static int threadCount; //本类的线程计数器

    static
    {
        threadCount = 0;
        threadCounterLock = new Integer(0);
    }

    public TestThread()
    {
        super();
    }

    public synchronized static void incThreadCount()
    {
        threadCount++;
        System.out.println("thread count after enter: " + threadCount);
    }

    public synchronized static void decThreadCount()
    {
        threadCount--;
        System.out.println("thread count after leave: " + threadCount);
    }

    public void run()
    {
        synchronized(threadCounterLock) //同步
        {
            threadCount++;
            System.out.println("thread count after enter: " + threadCount);
        }

        //incThreadCount(); //和上面的语句块是等价的

        final long nSleepMilliSecs = 1000;  //循环中的休眠时间

        long nCurrentTime = System.currentTimeMillis();
        long nEndTime = nCurrentTime + 30000;  //运行截止时间
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        try
        {
            while (nCurrentTime < nEndTime)
            {
                nCurrentTime = System.currentTimeMillis();
                System.out.println("Thread " + this.hashCode() + ", current time: " + simpleDateFormat.format(new Date(nCurrentTime)));

                try
                {
                    sleep(nSleepMilliSecs);
                }
                catch(InterruptedException ex)
                {
                    ex.printStackTrace();
                }
            }
        }
        finally
        {
            synchronized(threadCounterLock) //同步
            {
                threadCount--;
                System.out.println("thread count after leave: " + threadCount);
            }

            //decThreadCount();   //和上面的语句块是等价的
        }
    }

    public static void main(String[] args)
    {
        TestThread[] testThread = new TestThread[2];
        for (int i=0; i<testThread.length; i++)
        {
            testThread[i] = new TestThread();
            testThread[i].start();
        }
    }
}

同步就是简单的说我用的时候你不能用,大家用的要是一样的就这样!
比如说有只苹果很好吃,我拉起来咬一口,放下,你再拉起咬一口,这就同步了,要是大家一起咬,呵呵,那就结婚吧,婚礼上常能看到这个,也不怕咬着嘴,嘻嘻嘻!

举个例子,现在有个类,类中有一个私有成员一个苹果,两个方法一个看,一个吃。
现在不同步,我一“看”,哈哈一个苹果,我“吃”四分之一了
你一“看”,哈哈一个苹果,也“吃”四分之一了。
可能的情况就是都是看到一个苹果但我的吃方法用在你的之前,所以可能你只能吃到3/4的1/4也就是3/16个而不是1/4个苹果了。
现在加入同步锁,我在吃的时候你看被锁,等吃完了,你再看,啊3/4个苹果,吃1/3好了了,就这样!

Java线程及同步(synchronized)样例代码

Java线程及同步(synchronized)样例代码import java.io.*;import java.util.*;import java.text.SimpleDateFormat;pub...
  • duoshanx
  • duoshanx
  • 2004年08月25日 22:32
  • 3433

(二) Java多线程详解之同步代码块synchronized和线程通信详解

在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源,并且对资源做了写操作时,可能会导致数据混乱。这里用了卖票的例子,代码如下:public class ThreadExampl...
  • RobertoHuang
  • RobertoHuang
  • 2017年05月17日 22:06
  • 800

Java多线程简析——Synchronized(同步锁)、Lock以及线程池

Java多线程 Java中,可运行的程序都是有一个或多个进程组成。进程则是由多个线程组成的。 最简单的一个进程,会包括mian线程以及GC线程。 线程的状态 线程状态由以下一张网上图片来说明: 在...
  • yangzhaomuma
  • yangzhaomuma
  • 2016年04月25日 00:56
  • 17165

线程-synchronized方法和同步块的作用范围;synchronized(this)和synchronized(obj)的区别

原文:http://m.blog.csdn.net/blog/u010802573/38661719 参考资源: http://www.cnblogs.com/oracleDBA/archi...
  • lan861698789
  • lan861698789
  • 2015年12月29日 12:04
  • 4011

java synchronized(同步代码块)

Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。     一、当两个并发线程访问同一个对象object中的这个synchronized...
  • cuigx1991
  • cuigx1991
  • 2016年02月26日 22:14
  • 1768

从头认识java-17.4 详解同步(4)-同步阻塞、synchronized和volatile

这一章节我们来介绍同步阻塞、synchronized和volatile。1.同步阻塞之前我们提到过synchronized放在同步方法上:public synchronized void transf...
  • raylee2007
  • raylee2007
  • 2016年01月13日 22:01
  • 2424

Java 内部类,多线程中Synchronized与wait,notify的使用

工作内容: 1.成员内部类    与成员方法,属性的访问权限一致 2.静态内部类    修饰符 stactic 类名{...} 3.匿名内部类    new 类名()/接口名(重写接口方法) 4.局...
  • yingtian648
  • yingtian648
  • 2016年07月22日 08:59
  • 540

Java多线程--同步与死锁:synchronized;等待与唤醒:wait、notify、notifyAll;生命周期

1、问题的引出 class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void ru...
  • waldmer
  • waldmer
  • 2013年10月12日 09:34
  • 7503

Java多线程,线程同步synchronized,线程死锁【线程池常规用法】多线程并发处理

工作内容: 1.线程同步:synchronized (锁类) 2.线程死锁 3.生产者与消费者模式 4.线程练习 线程同步: Synchronized(Object){ 代码块 } Public ...
  • yingtian648
  • yingtian648
  • 2016年07月14日 09:01
  • 369

同步——synchronized机制、Lock和Conditon机制和关于线程中断

Java在java SE 5.0引入了不同与synchronized的另一种加锁方式,java.util.concurrent.Locks包中的两个锁类:ReetrantLock类,为可重入锁。 还有...
  • jingsuwen1
  • jingsuwen1
  • 2016年07月06日 15:45
  • 3400
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java线程及同步(synchronized)样例代码 [转]
举报原因:
原因补充:

(最多只允许输入30个字)