线程失去CPU使用权后会释放所占的资源吗?

时间:2021-03-27 21:14:14
线程失去CPU使用权后会释放所占的资源的锁吗?
比如web应用中前台多个请求到达后台,后台启动多个线程处理这些请求(不知道是不是一一对应),这些线程是的调度是容器维护的,这些线程可能都会访问一个static变量,当一个线程访问static变量的时候失去了CPU使用权,这个static会被锁住吗?如果不被锁住,是不是这些线程的调度不是通过sleep之类的方法实现的?

8 个解决方案

#1


莫名其妙,为什么你觉得变量会被锁住?

#2


Thread.sleep(x):该线程不丢失任何监视器的所属权

#3


顺便贴段代码:

class T1 extends Thread {
/**
 * @see java.lang.Thread#run()
 */
@Override
public void run() {
System.out.println(ThreadTest.x.length);
for (int i = 0; i < ThreadTest.x.length; i++) {
try {
System.out.println("T1 loop...");
// Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

class T2 extends Thread {
/**
 * @see java.lang.Thread#run()
 */
@Override
public void run() {
for (String s : ThreadTest.x) {
try {
System.out.println("T2 loop...");
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

public class ThreadTest {

public static String[] x = new String[10];

@Test
public void testThread() {
T1 t1 = new T1();
T2 t2 = new T2();
Thread tt = new Thread(t1);
Thread ttt = new Thread(t2);
tt.start();

ttt.start();
}
}

结果:
T2 loop...
10
T1 loop...
T1 loop...
T1 loop...
T1 loop...
T1 loop...
T1 loop...
T1 loop...
T1 loop...
T1 loop...
T1 loop...

T2调用sleep就退出循环了,这是什么原因?

#4


个人觉得sleep不会太常用。

#5


引用 3 楼 a20081130 的回复:
顺便贴段代码:

class T1 extends Thread {
/**
* @see java.lang.Thread#run()
*/
@Override
public void run() {
System.out.println(ThreadTest.x.length);
for (int i = 0; i < ThreadTest.x.length; i++) {……
你sleep了,不能算退出循环,只是暂时停止这个循环。把CPU让给其他线程了。static变量跟锁不锁没有什么关系。除非你代码里对这个变量加锁,否则不存在锁的情况

#6


确实是退出了,在eclipse里测试过的,这是@Test的问题,使用main方法就正常了。
sleep的方法说明线程调用sleep后不会释放所占用的资源,这些资源就包括这些static变量,既然这个变量被sleep的线程锁了,为什么还能被其他的线程访问呢?

#7


sleep方法所说的锁是需要编程是定义锁的机制,比如使用synchronized关键字修饰。所以对于没有编程指定锁的变量就不存在锁的问题。

#8


变量只是对编译器来说的,操作系统只知道内存地址

#1


莫名其妙,为什么你觉得变量会被锁住?

#2


Thread.sleep(x):该线程不丢失任何监视器的所属权

#3


顺便贴段代码:

class T1 extends Thread {
/**
 * @see java.lang.Thread#run()
 */
@Override
public void run() {
System.out.println(ThreadTest.x.length);
for (int i = 0; i < ThreadTest.x.length; i++) {
try {
System.out.println("T1 loop...");
// Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

class T2 extends Thread {
/**
 * @see java.lang.Thread#run()
 */
@Override
public void run() {
for (String s : ThreadTest.x) {
try {
System.out.println("T2 loop...");
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

public class ThreadTest {

public static String[] x = new String[10];

@Test
public void testThread() {
T1 t1 = new T1();
T2 t2 = new T2();
Thread tt = new Thread(t1);
Thread ttt = new Thread(t2);
tt.start();

ttt.start();
}
}

结果:
T2 loop...
10
T1 loop...
T1 loop...
T1 loop...
T1 loop...
T1 loop...
T1 loop...
T1 loop...
T1 loop...
T1 loop...
T1 loop...

T2调用sleep就退出循环了,这是什么原因?

#4


个人觉得sleep不会太常用。

#5


引用 3 楼 a20081130 的回复:
顺便贴段代码:

class T1 extends Thread {
/**
* @see java.lang.Thread#run()
*/
@Override
public void run() {
System.out.println(ThreadTest.x.length);
for (int i = 0; i < ThreadTest.x.length; i++) {……
你sleep了,不能算退出循环,只是暂时停止这个循环。把CPU让给其他线程了。static变量跟锁不锁没有什么关系。除非你代码里对这个变量加锁,否则不存在锁的情况

#6


确实是退出了,在eclipse里测试过的,这是@Test的问题,使用main方法就正常了。
sleep的方法说明线程调用sleep后不会释放所占用的资源,这些资源就包括这些static变量,既然这个变量被sleep的线程锁了,为什么还能被其他的线程访问呢?

#7


sleep方法所说的锁是需要编程是定义锁的机制,比如使用synchronized关键字修饰。所以对于没有编程指定锁的变量就不存在锁的问题。

#8


变量只是对编译器来说的,操作系统只知道内存地址