多线程怎么使用同一个对象呢?
除了static,还有什么办法呢?
本人入行不久,基础不太扎实,还请细讲
java提供了一个稍弱的同步机制,用volidate修饰变量,此时变量具备了可见性,当线程读取该变量时,他会从内存中去读取,不会再读取工作内存中的变量副本。修改该变量时也会更新内存中该变量的值。
但是,volidate修饰的变量,是无法保证变量的同步性的。
不变的常量可以设置成static,但如果涉及到多线程的时候,每个线程一般在使用的时候单独创建对象,不建议共享,否则可能出现脏读
使用volatile关键字来解决变量在多个线程之间 "可见",而synchronized关键字来保证多个线程之间 "同步"
不变的常量可以设置成static,但如果涉及到多线程的时候,
每个线程一般在使用的时候单独创建对象,不建议共享,
否则可能出现脏读
用sys忘记怎么样拼写了你学习一下
创建线程的第一种方式:
创建一个类继承Thread
重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置。)
创建子类对象,其实就是在创建线程
启动线程start()
这种方式的特点(缺陷):线程任务和线程是绑定在一起的。
为了解决四个线程共享票的问题,需要使用创建线程的第二种方式:
创建实现了Runnable接口的子类
重写Runnable接口中的run方法
创建实现了Runnable接口的子类的对象
创建Thread类的对象,也就是在创建线程
把实现了Runnable接口的子类对象作为参数传递给Thread类的构造方法
这种方式的特点是:把线程任务进行了描述,也就是面向对象,从而实现了线程任务和线程对象的分离。线程执行什么任务不再重要,只要是实现了Runnable接口的子类对象都可以作为参数传递给Thread的构造方法,此方式较为灵活。
尽量用原子性的对象声明变量,例如:
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);
}
}
我发现你们扯远了啊。楼主没问线程安全的问题,是问这么共享这个变量,就一个能不能访问的问题。
我给你说一个最基础的。你在new 一个线程的时候,把这个变量的引用传给这个线程的构造器不就完事了吗
如果只要求变量共享的话,我建议使用volitale。