首页 > 代码库 > 传统多线程之同步锁(二)
传统多线程之同步锁(二)
一. 线程安全
线程安全问题是指程序中公用的东西被多个线程访问,比如:类的静态变量
二. 同步锁
有什么办法可以解决线程安全问题呢?那就是在程序中加锁
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
传统多线程之同步锁(二)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。