1、第一段代码如下:(用了str能说明什么呢?这是锁住什么了?)
public class TextThread
{ /**
* @param args
*/
public static void main(String[] args)
{
// TODO 自动生成方法存根
TxtThread tt = new TxtThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
} }
class TxtThread implements Runnable
{
int num = 100;
String str = new String();
public void run()
{
while (true)
{
synchronized(str) //用了str能说明什么呢?这是锁住什么了?
{
if (num>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.getMessage();
}
System.out.println(Thread.currentThread().getName()+ "this is "+ num--);
}
}
}
}
}
2、第二段代码如下:
将synchronized作用于static函数:示例代码如下: Class Foo
{
public synchronized static void methodAAA()//同步的static 函数 ,为什么要是static函数,要是不是static的怎样?
{
//….
} public void methodBBB()
{
synchronized(Foo.class) //class literal(类名称字面常量)
}
} 代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。 可以推断:如果一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为它们的锁都不一样。A方法的锁是Obj这个对象,而B的锁是Obj所属的那个Class。
以上是从网上搜的,实在没有看懂
三个问题:
1、第一段代码的synchronized的str是锁住了什么?有什么作用
2、第二段代码为什么要用static的方法,非静态的话会怎样?
3、第二段代码中是锁住了class类字面常量,有什么作用,要在什么情况下使用?请各位大神不吝施教
public class TextThread
{ /**
* @param args
*/
public static void main(String[] args)
{
// TODO 自动生成方法存根
TxtThread tt = new TxtThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
} }
class TxtThread implements Runnable
{
int num = 100;
String str = new String();
public void run()
{
while (true)
{
synchronized(str) //用了str能说明什么呢?这是锁住什么了?
{
if (num>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.getMessage();
}
System.out.println(Thread.currentThread().getName()+ "this is "+ num--);
}
}
}
}
}
2、第二段代码如下:
将synchronized作用于static函数:示例代码如下: Class Foo
{
public synchronized static void methodAAA()//同步的static 函数 ,为什么要是static函数,要是不是static的怎样?
{
//….
} public void methodBBB()
{
synchronized(Foo.class) //class literal(类名称字面常量)
}
} 代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。 可以推断:如果一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为它们的锁都不一样。A方法的锁是Obj这个对象,而B的锁是Obj所属的那个Class。
以上是从网上搜的,实在没有看懂
三个问题:
1、第一段代码的synchronized的str是锁住了什么?有什么作用
2、第二段代码为什么要用static的方法,非静态的话会怎样?
3、第二段代码中是锁住了class类字面常量,有什么作用,要在什么情况下使用?请各位大神不吝施教
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货