一、如果是每个线程都执行相同的代码,则可以使用同一个Runnable来实现共享

public class MultiThreadShareData {
public static void main(String[] args) {
new Thread(new ShareData()).start();
new Thread(new ShareData()).start();
} static class ShareData implements Runnable{
private int j = 100;
@Override
public synchronized void run() {
j--;
}
}
}

上面代码中两个线程共享数据实现对j变量的递减操作,至于上面代码中为什么要使用一个静态内部类,该类static的作用是不依赖外部类的实例创建对象。

二、如果每个线程执行的代码不同,则需要使用不同的Runnable对象来实现共享

public class MultiThreadShareData {
public static void main(String[] args) {
final ShareData data1 = new ShareData();
//启动第一个线程
new Thread(new Runnable() { @Override
public void run() {
data1.increment(); //加
}
}).start();
//启动第二个线程
new Thread(new Runnable() { @Override
public void run() {
data1.decrement(); //减
}
}).start();
} static class ShareData{
private int j = 0;
public synchronized void increment(){
j++;
} public synchronized void decrement(){
j--;
}
}
}

将上面代码进修改(将数据作为外部类的成员变量,让Runnable接口操作该成员变量)如下:

public class MultiThreadShareData {
public static void main(String[] args) {
ShareData data1 = new ShareData();
new Thread(new MyRunnable1(data1)).start();
new Thread(new MyRunnable2(data1)).start();
} static class MyRunnable1 implements Runnable{
private ShareData data1;
public MyRunnable1(ShareData data1){
this.data1 = data1;
}
@Override
public void run() {
data1.increment();
} } static class MyRunnable2 implements Runnable{ private ShareData data1; public MyRunnable2(ShareData data2){
this.data1 = data1;
} @Override
public void run() {
data1.decrement();
} } static class ShareData{
private int j = 0;
public synchronized void increment(){
j++;
} public synchronized void decrement(){
j--;
}
}
}

三、一道面试题(设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1)

/** 

  * 设计 4 个 ( 可以是 n 个 ) 线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1 

  */ 

package com.jiaocaigen.test; 

public class Test { 

    // 采用 Runnable 接口方式创建的多条线程可以共享实例属性 

    private int i ; 

    // 同步增加方法 

    private synchronized void inc(){ 

       i ++; 

       System. out .println(Thread.currentThread().getName()+ "--inc--" + i );

    } 

    // 同步减算方法 

    private synchronized void dec(){ 

       i --; 

       System. out .println(Thread.currentThread().getName()+ "--dec--" + i );

    } 

// 增加线程 

    class Inc implements Runnable {

       public void run() { 

           inc(); 

       } 

    } 

    // 减算线程 

    class Dec implements Runnable{

       public void run() { 

           dec(); 

       } 

    } 

    public static void main(String[] args) { 

       Test t = new Test(); 

        // 内部类的实例化 

       Inc inc = t. new Inc(); 

       Dec dec = t. new Dec(); 

       // 创建 2*n 个线程 此处 n=2 

       for ( int i = 0; i < 2; i++) {

           new Thread(inc).start(); 

           new Thread(dec).start(); 

       } 

    } 

}

Android多线程研究(5)——线程之间共享数据的更多相关文章

  1. JAVA多线程提高四:多个线程之间共享数据的方式

    多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...

  2. JAVA多线程学习八-多个线程之间共享数据的方式

    多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...

  3. JAVA 并发编程-多个线程之间共享数据

    原文地址:http://blog.csdn.net/hejingyuan6/article/details/47053409# 多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个R ...

  4. JAVA 并发编程-多个线程之间共享数据(六)

    多线程共享数据的方式: 1.假设每一个线程运行的代码同样.能够使用同一个Runnable对象,这个Runnable对象中有那个共享数据,比如,卖票系统就能够这么做. 2,假设每一个线程运行的代码不同. ...

  5. 【转】JAVA 并发编程-多个线程之间共享数据

    原文地址:http://blog.csdn.net/hejingyuan6/article/details/47053409# 多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个R ...

  6. day33 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

    今日内容: 1.线程理论 2.锁: 牺牲了效率,保证了数据的安全(重点) 3.守护线程 4.GIL锁:(重点) 5.计算密集型和IO密集型 6.信号量,事件(了解) 7.补充. 子进程中不能input ...

  7. Android多线程研究(6)——多线程之间数据隔离

    在上一篇<Android多线程研究(5)--线程之间共享数据>中对线程之间的数据共享进行了学习和研究,这一篇我们来看看怎样解决多个线程之间的数据隔离问题,什么是数据隔离呢?比方说我们如今开 ...

  8. Java并发基础09. 多个线程间共享数据问题

    先看一个多线程间共享数据的问题: 设计四个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显涉及到了线程间通数据的共享,四个线程共享一个 data,共同操作 ...

  9. Disruptor 线程间共享数据无需竞争

    队列的作用是缓冲 缓冲到 队列的空间里.. 线程间共享数据无需竞争 原文 地址  作者  Trisha   译者:李同杰 LMAX Disruptor 是一个开源的并发框架,并获得2011 Duke’ ...

随机推荐

  1. theme-不同主题资源更改

    1.找到了影响桌面小部件的布局文件packages/apps/Mms$ vim res/layout/widget.xml修改里面的背景颜色属性,可以实现预期效果,至于里面的 <LinearLa ...

  2. android图像处理系列之六--给图片添加边框(下)-图片叠加

    前面介绍了一种用透明图片叠加的方式添加花边边框,下面将介绍另外一种图片叠加添加花边边框的方式.前面方法有一个缺点,就是做成PNG图片,图片体积会很大,不是一般的大,比同样的JPG大三倍多,如果项目可以 ...

  3. 根据点画线java

    package com.yang; import java.awt.Color; import java.awt.Graphics; import java.util.ArrayList; impor ...

  4. CSS笔记 - SVG Polyline 图片绘制动画边框

    <style> div{ width: 420px; height: 200px; background: url('./img/timg.jpg') no-repeat; } polyl ...

  5. 常用处理字符串的SQL函数

    汇总函数:Count.Sum.AVG.MAX.min; 数学函数: ABS:绝对值.floor:给出比给定值小的最大整数. round(m,n):m为给定的值,n为小数点后保留的位数. power(m ...

  6. SQL分页的几种方式

    1.使用Row_number() over(order by columnName)函数来作为标示分页(下面的例子都是以last_seen来排序的,要求取顺序为20-30行的数据) SELECT Us ...

  7. 不重新启动VMWare虚拟机加入虚拟磁盘的方法(上)

    近期因为业务须要在不重新启动系统的前提下对系统进行扩容,前提是该系统做过lvm.可是没有足够的物理卷(硬盘),所以引出了改文.本文共分为上下两部分.这是第一部分. 文件夹 加入磁盘 做LVM 加入硬盘 ...

  8. 【MongoDB】The connection between two tables

    In mongoDB, there are two general way to connect with two tables. Manual Connection and use DBRef 1. ...

  9. elasticsearch cluster 概述

    在源码概述中我们分析过,elasticsearch源码从功能上可以分为分布式功能和数据功能,接下来这几篇会就分布式功能展开.这里首先会对cluster作简单概述,然后对cluster所涉及的主要功能详 ...

  10. VC++ 6.0 BUG BUG BUG BUG BUG

    http://blog.163.com/amao831@126/blog/#m=0 我经常在的VC++6.0中 定义某个类的对象时 再用.访问或者->访问时不自动弹出他的成员函数或者成员变量 最 ...