什么时候线程会释放对象上的锁?

时间:2015-10-12 18:41:57

标签: java multithreading locking synchronized

我是多线程新手。目前我正在学习锁定并通知和同步块。我创建了一个小程序来检查如何等待和通知使用同步块,如果我不会创建任何线程(我认为主线程将获得锁定)。以下是更好理解的代码。

public class Problem1 
{
    public void waitForSignal() throws InterruptedException
    {
        Object obj=new Object();
        synchronized (obj) {
        obj.wait();
        obj.notify();
        }
    }
    public static void main(String args[]) throws InterruptedException
    {
        Problem1 pb=new Problem1();
        pb.waitForSignal();
        System.out.println("hello");//controll not come here
    }

}

如果我运行上述程序,它会卡住。和控制都不会通知notify(),也不会退出同步块。为什么代码表现得像这样。 我试图在谷歌搜索,我发现以下声明

  

wait()告诉调用线程放弃监视器并转到   睡觉直到其他一些线程进入同一个监视器并调用   notify()。

我从上面的陈述中理解,为了正确执行我的程序,我必须创建另一个线程,它将进入同一个监视器并中断当前锁定保持线程的执行。如果我错了,请让我纠正。 请我纠正上面的代码,这样它就可以正常工作而不会被困住。

1 个答案:

答案 0 :(得分:3)

当您致电Angle = [1 7 15]; for i = 1:length(Angle) % do some calculations here %% % % % cl_matrix(i,:) = A.data(:,7); % Populate cl_matrix cl_matrix(i,:) = randi(10,1,10)*Angle(i); % Create a struct with dinamic filed names cl_struct_same_length.(['cl_' num2str(Angle(i))])=cl_matrix(i,:) cl_struct_different_length.(['cl_' num2str(Angle(i))])=randi(10,1,Angle(i)) end % Use "fieldnames" to get the names of the dinamically generated struct's field cl_fields=fieldnames(cl_struct_same_length) % Loop through the struct's fileds to perform some calculation on the % stored values for i=1:length(cl_fields) cl_means(i)=mean(cl_struct_same_length.(cl_fields{i})) end % Assign the value stored in a struct's field to a variable row_2_of_cl_matrix=getfield(cl_struct_different_length,(['cl_' num2str(Angle(2))])) 时,其他一些线程必须获取wait上的锁定并致电objnotify以表示等待线程继续进行。最简单的理解方法是在Consumer / Producer问题的上下文中,Oracle有一个关于that的非常好的教程。

线程中断是完全不同的。它是请求被中断的线程检查其中断状态并终止处理。 Brian Goetz在properly handling InterruptedException的背景下有一篇很好的文章。