线程:
多线程的好处:解决了在一个进程中同时执行多个任务代码的问题。
自定义线程的创建方式:
1.自定一个类继承thread类,重写thread的run方法 吧自定义线程的任务代码写在run方法内,创建thread子类的对象并且调用start()方法启动线程。
2.自定义一个类实现runnable接口,实现runnable接口中run方法,吧自定义线程的任务代码写在run方法内部,创建runnable实现类的对象 ,创建thread对象并且把runnable实现类的对象作为参数传递,调用thread对象的start方法开启线程。
线程安全问题出现的根本原因:
必须存在着两个或者两个以上的线程共享一个资源。
操作共享资源的代码必须有两句或者有两句以上
线程安全问题的解决方案:
同步代码块解决
synchronized(锁){
需要被同步的代码
}
同步行数解决:
修饰符 synchronized 函数名(形参列表。。。){
}
1 public class demo1 extends Thread{ 2 3 public demo1(String name) { 4 super(name); 5 } 6 public void run() { 7 for (int i = 0; i < 50; i++) { 8 System.out.println(Thread.currentThread().getName()+":"+i); 9 } 10 } 11 public static void main(String[] args) { 12 demo1 demo1 = new demo1("sony"); 13 demo1.start(); 14 for (int i = 0; i < 50; i++) { 15 System.out.println(Thread.currentThread().getName()+":"+i); 16 } 17 } 18 }
sony:0 main:0 sony:1 main:1 sony:2 main:2 sony:3 sony:4 main:3 sony:5 main:4 sony:6 main:5 sony:7 main:6 sony:8 sony:9 sony:10 sony:11 sony:12 sony:13 sony:14 sony:15 sony:16 sony:17 sony:18 sony:19 sony:20 sony:21 sony:22 sony:23 sony:24 main:7 sony:25 main:8 sony:26 main:9 sony:27 main:10 sony:28 main:11 sony:29 main:12 sony:30 main:13 main:14 sony:31 main:15 sony:32 main:16 sony:33 main:17 main:18 sony:34 main:19 main:20 sony:35 main:21 sony:36 sony:37 sony:38 main:22 sony:39 main:23 sony:40 main:24 main:25 main:26 sony:41 main:27 sony:42 main:28 sony:43 main:29 sony:44 main:30 sony:45 main:31 sony:46 main:32 sony:47 main:33 sony:48 main:34 sony:49 main:35 main:36 main:37 main:38 main:39 main:40 main:41 main:42 main:43 main:44 main:45 main:46 main:47 main:48 main:49
注意事项:
同步代码块的锁 可以是任意的对象。但是同步锁对象必须是多线程共享的对象,否则锁不住。
同步函数的锁 是固定的 非静态函数的锁对象是 this对象,静态函数的锁对象时 class对象。
在同步代码块或同步函数中调用sleep方法是不会释放锁对象的。如果调用的wait方法是会释放锁对象的。