比如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就退出循环了,这是什么原因?
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
你sleep了,不能算退出循环,只是暂时停止这个循环。把CPU让给其他线程了。static变量跟锁不锁没有什么关系。除非你代码里对这个变量加锁,否则不存在锁的情况
#6
确实是退出了,在eclipse里测试过的,这是@Test的问题,使用main方法就正常了。
sleep的方法说明线程调用sleep后不会释放所占用的资源,这些资源就包括这些static变量,既然这个变量被sleep的线程锁了,为什么还能被其他的线程访问呢?
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就退出循环了,这是什么原因?
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
你sleep了,不能算退出循环,只是暂时停止这个循环。把CPU让给其他线程了。static变量跟锁不锁没有什么关系。除非你代码里对这个变量加锁,否则不存在锁的情况
#6
确实是退出了,在eclipse里测试过的,这是@Test的问题,使用main方法就正常了。
sleep的方法说明线程调用sleep后不会释放所占用的资源,这些资源就包括这些static变量,既然这个变量被sleep的线程锁了,为什么还能被其他的线程访问呢?
sleep的方法说明线程调用sleep后不会释放所占用的资源,这些资源就包括这些static变量,既然这个变量被sleep的线程锁了,为什么还能被其他的线程访问呢?
#7
sleep方法所说的锁是需要编程是定义锁的机制,比如使用synchronized关键字修饰。所以对于没有编程指定锁的变量就不存在锁的问题。
#8
变量只是对编译器来说的,操作系统只知道内存地址