本文共 1431 字,大约阅读时间需要 4 分钟。
示例代码
public class TestMain implements Runnable { //格式化 static SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public void run() { method(); } //这里要构建静态方法就得把方法抽出来,重写run()方法是不支持static修饰符的 public static synchronized void method() { Date satrtTime = new Date(); String time = sim.format(satrtTime); System.out.println(time + ":【" + Thread.currentThread().getName() + "访问了方法】"); try { //睡眠3秒 Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } Date endTime = new Date(); String time2 = sim.format(endTime); System.out.println(time2 + ":【" + Thread.currentThread().getName() + "准备退出这个方法了】"); } public static void main(String[] args) throws Exception { //创建一个对象testMain1 TestMain testMain1 = new TestMain(); //再创建一个对象testMain2 TestMain testMain2 = new TestMain(); System.out.println("运行开始"); Thread thread1 = new Thread(testMain1); Thread thread2 = new Thread(testMain2); thread1.start(); thread2.start(); //让主线程做个等待,等线程一和线程二都执行完它才继续执行 thread1.join(); thread2.join(); System.out.println("运行结束"); }}
运行结果:
总结
从运行结果可以发现,这时虽然用了两个不同的实例对象,但是Thread-1线程还是要等待Thread-0释放锁,这时因为用static修饰的方法属于类方法,这时的锁是类锁,类只有一个,不管你实例化了多少个对象,他们类都是一样的,所以锁也是一样的,自然需要等待和竞争。
转载地址:http://pzjp.baihongyu.com/