qq_40164181
2018-05-03 09:13
采纳率: 18.2%
浏览 1.8k
已采纳

java如何创建一个线程共享的对象?

多线程怎么使用同一个对象呢?
除了static,还有什么办法呢?

本人入行不久,基础不太扎实,还请细讲

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • MrsillyX 2018-05-03 09:38
    已采纳

    图片说明
    java提供了一个稍弱的同步机制,用volidate修饰变量,此时变量具备了可见性,当线程读取该变量时,他会从内存中去读取,不会再读取工作内存中的变量副本。修改该变量时也会更新内存中该变量的值。
    但是,volidate修饰的变量,是无法保证变量的同步性的。

    打赏 评论
  • 黑夜星星 2018-05-03 09:18

    不变的常量可以设置成static,但如果涉及到多线程的时候,每个线程一般在使用的时候单独创建对象,不建议共享,否则可能出现脏读

    打赏 评论
  • weixin_39912953 2018-05-03 09:26

    使用volatile关键字来解决变量在多个线程之间 "可见",而synchronized关键字来保证多个线程之间 "同步"

    打赏 评论
  • weixin_42080472 2018-05-03 10:09

    不变的常量可以设置成static,但如果涉及到多线程的时候,
    每个线程一般在使用的时候单独创建对象,不建议共享,
    否则可能出现脏读

    打赏 评论
  • 小枫子jerry 2018-05-03 10:12

    用sys忘记怎么样拼写了你学习一下

    打赏 评论
  • qq_40529349 2018-05-03 12:39

    创建线程的第一种方式:
    创建一个类继承Thread
    重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置。)
    创建子类对象,其实就是在创建线程
    启动线程start()
    这种方式的特点(缺陷):线程任务和线程是绑定在一起的。

    为了解决四个线程共享票的问题,需要使用创建线程的第二种方式:
    创建实现了Runnable接口的子类
    重写Runnable接口中的run方法
    创建实现了Runnable接口的子类的对象
    创建Thread类的对象,也就是在创建线程
    把实现了Runnable接口的子类对象作为参数传递给Thread类的构造方法
    这种方式的特点是:把线程任务进行了描述,也就是面向对象,从而实现了线程任务和线程对象的分离。线程执行什么任务不再重要,只要是实现了Runnable接口的子类对象都可以作为参数传递给Thread的构造方法,此方式较为灵活。

    打赏 评论
  • jiaincs 2018-05-04 01:40

    尽量用原子性的对象声明变量,例如:

     public class Test {
        public  AtomicInteger inc = new AtomicInteger();
    
        public  void increase() {
            inc.getAndIncrement();
        }
    
        public static void main(String[] args) {
            final Test test = new Test();
            for(int i=0;i<10;i++){
                new Thread(){
                    public void run() {
                        for(int j=0;j<1000;j++)
                            test.increase();
                    };
                }.start();
            }
    
            while(Thread.activeCount()>1)  //保证前面的线程都执行完
                Thread.yield();
            System.out.println(test.inc);
        }
    }
    
    打赏 评论
  • miaoch 2018-05-04 02:26

    我发现你们扯远了啊。楼主没问线程安全的问题,是问这么共享这个变量,就一个能不能访问的问题。
    我给你说一个最基础的。你在new 一个线程的时候,把这个变量的引用传给这个线程的构造器不就完事了吗

    打赏 评论
  • 亲爱的撒旦 2018-05-04 04:48

    如果只要求变量共享的话,我建议使用volitale。

    打赏 评论

相关推荐 更多相似问题