Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java对同一函数的并发执行_Java - Fatal编程技术网

Java对同一函数的并发执行

Java对同一函数的并发执行,java,Java,是否可以从线程并发执行相同的函数。我怀疑java方法区域是否相同,因此对同一函数的多次调用可能会导致等待状态,对吗?是的,除非您使用了同步,否则可能不会有任何等待锁定。这是默认行为,不能交错锁定和线程执行 但是请记住,线程调度程序将允许在给定时间运行一个线程 默认情况下,在没有同步的情况下,无等待的并发访问是行为 示范样品 public class MyThread implements Runnable { private MyThreadInvocation threadInvo

是否可以从线程并发执行相同的函数。我怀疑java方法区域是否相同,因此对同一函数的多次调用可能会导致等待状态,对吗?

是的,除非您使用了同步,否则可能不会有任何等待锁定。这是默认行为,不能交错锁定和线程执行

但是请记住,线程调度程序将允许在给定时间运行一个线程

默认情况下,在没有同步的情况下,无等待的并发访问是行为

示范样品

public class MyThread implements Runnable {

    private MyThreadInvocation  threadInvocation    = null;

    public MyThread(MyThreadInvocation threadInvocation) {
        this.threadInvocation = threadInvocation;
    }

    @Override
    public void run() {
        System.out.println("Calling from : " + Thread.currentThread().getName());
        this.threadInvocation.printMessage();
    }
}


public class MyThreadInvocation {
    public void printMessage(){
        System.out.println("Hello");
    }

    public static void main(String[] args) {
        MyThreadInvocation myThreadInvocation = new MyThreadInvocation();
        Thread t1 = new Thread(new MyThread(myThreadInvocation));
        t1.setName("First Thread");

        Thread t2 = new Thread(new MyThread(myThreadInvocation));
        t2.setName("Second Thread");

        Thread t3 = new Thread(new MyThread(myThreadInvocation));
        t3.setName("Third Thread");

        t1.start();
        t2.start();
        t3.start();
    }
}

是的,这是可能的,除非您已经使用了同步,否则将不会有任何等待锁定。这是默认行为,不能交错锁定和线程执行

但是请记住,线程调度程序将允许在给定时间运行一个线程

默认情况下,在没有同步的情况下,无等待的并发访问是行为

示范样品

public class MyThread implements Runnable {

    private MyThreadInvocation  threadInvocation    = null;

    public MyThread(MyThreadInvocation threadInvocation) {
        this.threadInvocation = threadInvocation;
    }

    @Override
    public void run() {
        System.out.println("Calling from : " + Thread.currentThread().getName());
        this.threadInvocation.printMessage();
    }
}


public class MyThreadInvocation {
    public void printMessage(){
        System.out.println("Hello");
    }

    public static void main(String[] args) {
        MyThreadInvocation myThreadInvocation = new MyThreadInvocation();
        Thread t1 = new Thread(new MyThread(myThreadInvocation));
        t1.setName("First Thread");

        Thread t2 = new Thread(new MyThread(myThreadInvocation));
        t2.setName("Second Thread");

        Thread t3 = new Thread(new MyThread(myThreadInvocation));
        t3.setName("Third Thread");

        t1.start();
        t2.start();
        t3.start();
    }
}

是的。默认情况下,您可以并发执行方法。要停止并发执行,需要使用synchronized关键字或并发类。默认情况下,您可以并发执行方法。要停止并发执行,您需要使用synchronized关键字或并发类

是,完全可以从多个线程并发调用同一函数。每个线程都有自己的堆栈,这意味着它获取函数中使用的局部变量的副本

在多核机器上,线程甚至可能在同一功能中同时运行


当然,如果多个线程访问相同的可变状态(例如,一个对象中的一个字段,两个线程都对该字段进行读写),那么从多个线程并发调用相同的函数可能会导致问题。如果要防止这些问题,您需要使用某种形式的锁定或同步。

是的,完全可以从多个线程同时调用同一个函数。每个线程都有自己的堆栈,这意味着它获取函数中使用的局部变量的副本

在多核机器上,线程甚至可能在同一功能中同时运行


当然,如果多个线程访问相同的可变状态(例如,一个对象中的一个字段,两个线程都对该字段进行读写),那么从多个线程并发调用相同的函数可能会导致问题。如果要防止这些问题,您需要使用某种形式的锁定或同步。

答案是否定的,除非您使用
synchronized
关键字。阅读位于的教程。答案是否定的,除非您使用
synchronized
关键字。阅读教程在。