一、如果是每个线程都执行相同的代码,则可以使用同一个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. 为什么会出现NoSQL数据库

    为什么会出现NoSQL数据库 一.总结 一句话总结:sql不支持分布式且且有性能瓶颈且不支持分布式,不同NoSQL适合不同的场景 1."不同的NoSQL数据库只适合不同的场景"这句 ...

  2. php课程 12-39 继承中parent的作用是什么

    php课程 12-39 继承中parent的作用是什么 一.总结 一句话总结:PHP5中使用parent::来引用父类的方法.parent:: 可用于调用父类中定义的成员方法. parent::的追溯 ...

  3. 非阻塞键盘检测getchar()

    #include <stdio.h> #include <conio.h> #include <Windows.h> int main() { char c; wh ...

  4. pycharm 注册 License server方式

    在输入框输入以下内容即可:http://idea.yangyusb.com

  5. git 常用命令(分支)

    查看分支 git branch -r 修改分支名字dev-->test git branch -m dev test 切换分支dev git checkout dev 创建本地分支dev git ...

  6. 【Tomcat】严重: Context [/grouponAdminWeb] startup failed due to previous errors

    1 tomcat 6600启动报错[root@localhost webapps]#     sh /usr/local/apache-tomcat-6.0.37_6600/bin/startup.s ...

  7. theme-windowAnimationStyle 动画四个方法的意义

    首先看代码 <style name="Animation.Activity"> <!--A打开B,B的出现动画--> <item name=" ...

  8. 让ie6 7 8 9支持原生html5 websocket

      让ie6 7 8 9支持原生html5 websocket   从github上的 web-socket-js(socket.io好像也是用这个做的他们的flash替代传输方式)改过来的.不过值得 ...

  9. 编码与乱码(05)---GBK与UTF-8之间的转换--转载

    原文地址:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html [GBK转UTF-8] 在很多论坛.网上经常有网友问“  ...

  10. 【AtCoder Regular Contest 082】Derangement

    [链接]点击打开链接 [题意] 在这里写题意 [题解] 贪心. 连续一块的p[i]==i的话,对答案的贡献就应该为(这个连续块的长度+1)/2; 长度为1的也正确. (也即两两相邻的互换位置.) [错 ...