一. 线程安全
线程安全问题是指程序中公用的东西被多个线程访问,比如:类的静态变量
二. 同步锁
有什么办法可以解决线程安全问题呢?那就是在程序中加锁
Java有两种加锁的方法:
1. 在代码块中加锁 synchronized (this) { ... }
2. 在方法上加锁 public synchronized void xxx(){ ... }
示例代码:
public class TraditionalThreadSynchronized { public static void main(String[] args) { new TraditionalThreadSynchronized().init(); } private void init() { final Outputer outputer = new Outputer(); // 线程1 new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(10); outputer.output1("1111111111"); } catch (Exception e) { e.printStackTrace(); } } } }).start(); // 线程2 new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(10); outputer.output1("2222222222"); } catch (Exception e) { e.printStackTrace(); } } } }).start(); } class Outputer { public void output1(String name) { // 同步代码块 synchronized (this) { for (int i = 0; i < name.length(); i++) { System.out.print(name.charAt(i)); } System.out.println(); } } // 同步方法 public synchronized void output2(String name) { for (int i = 0; i < name.length(); i++) { System.out.print(name.charAt(i)); } System.out.println(); } } }
线程1和线程2因为都要调用output1方法并打印传入的name字符串,cpu就会来回的在两个线程之间切换,
有可能线程1打印到一半的时候就切换到线程2上,这显然是我们不想看到的,所以在代码内容中加锁,
这样可以保证一个线程调用方法结束才会执行下一个线程。
上面代码中的this指的是outputer对象,它就是一把锁,两个线程使用同一把锁才能实现同步。
而在方法上加锁也可以实现线程同步,在方法上使用synchronized关键字也是把this作为锁。
其实output1方法和output2方法也是同步的,因为他们都是使用this作为锁。
思考一个问题:如果把一个方法定义为静态的即:public static synchronized
那么它使用什么作为锁呢?答案是:该类的字节码对象xxx.class
时间: 2024-12-20 22:15:34