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类字面常量,有什么作用,要在什么情况下使用?请各位大神不吝施教