public class IncDecThread {
private int j=10;
/*
* 题目:用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
* 两个问题:
* 1、线程同步--synchronized
* 2、线程之间如何共享同一个j变量--内部类
*/
public static void main(String[] args) {
IncDecThread incDec=new IncDecThread();
Inc inc=incDec.new Inc();
Dec dec=incDec.new Dec();
for(int i=0;i<2;i++){
Thread thread=new Thread(inc);
thread.start();
thread=new Thread(dec);
thread.start();
}
}
public synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
public synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
class Inc implements Runnable{
public void run(){
for(int i=0;i<20;i++){
inc();
}
}
}
class Dec implements Runnable{
public void run(){
for(int i=0;i<20;i++){
dec();
}
}
}
}
第二种解法 :
package com.ljn.base;
/**
* @author lijinnan
* @date:2013-9-12 上午9:55:32
*/
public class IncDecThread2 {
/**
* 测试次数
*/
public static final int TEST_COUNT = 20;
/*
* 题目:用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
* 两个问题:
* 1、线程同步--synchronized
* 2、线程之间如何共享同一个j变量--将j以及对j的操作封装在Data类中,然后作为共享对象传递给IncRunnable和DecRunnable
*
* 相对上面第一种解法(利用内部类),本解法更符合面向对象的思想
*/
public static void main(String[] args) {
Data data = new Data();
//加1线程,2个
new Thread(new IncRunnable(data)).start();
new Thread(new IncRunnable(data)).start();
//减1线程,2个
new Thread(new DecRunnable(data)).start();
new Thread(new DecRunnable(data)).start();
}
}
class Data {
private int j = 10;
public synchronized void inc () {
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
public synchronized void dec () {
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
}
class IncRunnable implements Runnable {
private Data data;
public IncRunnable (Data data) {
this.data = data;
}
@Override
public void run() {
for (int i = 0; i < IncDecThread2.TEST_COUNT; i++) {
data.inc();
}
}
}
class DecRunnable implements Runnable {
private Data data;
public DecRunnable (Data data) {
this.data = data;
}
@Override
public void run() {
for (int i = 0; i < IncDecThread2.TEST_COUNT; i++) {
data.dec();
}
}
}
分享到:
相关推荐
用JAVA写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出
java 多线程 加减变量
详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...
Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...
一个简单记录java多线程下变量共享问题,分析多线程内部运行
NULL 博文链接:https://toknowme.iteye.com/blog/2212529
C#多线程互斥实例 多线程获取同一变量(不重复)。是一个很好的学习例子
Java线程:线程栈模型与线程的变量 12 Java线程:线程的调度-休眠 13 Java线程:线程的调度-优先级 16 Java线程:线程的调度-让步 19 Java线程:线程的调度-合并 22 Java线程:线程的调度-终止线程 25 Java线程:...
1.使用三种VC的多线程同步方法编写一个多线程的程序(要求在屏幕上先显示Hello,再显示World)。 1)基于全局变量的多线程同步程序; 2)基于事件的多线程同步程序; 3)基于临界区的多线程同步程序。
java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...
Thread安全是Java多线程编程中的一种设计理念,用于确保多个线程可以安全地共享数据和资源。Thread安全可以通过使用线程同步机制、线程安全的数据结构和ThreadLocal变量等方式来实现。 CAS操作 CAS(Compare And ...
1.Qt下,多线程使用互斥锁安全访问同一全局变量;2.源码中定义了ThreadA和ThreadB,定义变量后,依次调用函数start()来启动重写的run()函数
此代码采用直接给线程变量赋值不需要参数传递
Java 语言提供了多种方式来实现多线程编程,今天我们将讨论其中的两种实现方式,并使用四个线程来演示对变量 J 的加一和减一操作。 实现方式一:通过继承 Thread 类 在 Java 中,我们可以通过继承 Thread 类来创建...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
java多线程并发的在新窗口
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
Java多线程知识点总结主要讲解了Java中多线程编程的基础知识,包括线程的启动、volatile变量、多线程共享数据、wait、notify、notifyAll等。 线程的启动 在Java中,线程的启动可以通过start()方法来实现,start()...